1 将字符串转化为整数。
long stringToInt(char *s){
long result=0;
for(int i=0;s[i]!='\0';i++)
{
if(int(s[i])<48||int(s[i])>57)
{//除去非数字
continue;
}
result=result*10+(s[i]-'0');
}
return result;
}
2 将整数转化为字符串。(考虑正负号的问题)
void itoa (int n,char s[])
{
int i,j,sign;
if((sign=n)<0)//记录符号
n=-n;//使n成为正数
i=0;
do{
s[i++]=n+’0’;//取下一个数字
}while ((n/=10)>0);//删除该数字
if(sign<0)
s[i++]=’-’;
s[i]=’\0’;
for(j=i;j>=0;j--)//生成的数字是逆序的,所以要逆序输出
printf("%c",s[j]);
}
3 实现字符串拷贝函数strcpy。(程序的完整性)
char * strcpy(char * strDest,const char * strSrc)
{
if ((strDest==NULL)||(strSrc==NULL))
throw "Invalid argument(s)";
char * strDestCopy=strDest;
while ((*strDest++=*strSrc++)!='\0');
return strDestCopy;
}
4 编程实现memcpy函数。(以字节为单位的拷贝)
void* mymemcpy(void* dest, void* source, size_t count)
{
char *ret = (char *)dest;
char *dest_t = ret;
char *source_t = (char *)source;
while (count--)
{
*dest_t++ = *source_t++;
}
return ret;
}
5 编程实现memmove函数。
void* memmove(void* dest, void* source, size_t count)(考虑了指针地址重合的情况)
{
void* ret = dest;
if (dest <= source || dest >= (source + count))
{
//Non-Overlapping Buffers
//copy from lower addresses to higher addresses
while (count --)
*dest++ = *source++;
}
else
{
//Overlapping Buffers
//copy from higher addresses to lower addresses
dest += count - 1;
source += count - 1;
while (count--)
*dest-- = *source--;l
}
return ret;
}
同memcpy一样,在写的实际过程中我们始终以字节为单位进行相关的拷贝。
6 写一个函数,目的是把char组成的字符串循环右移n位。比如,“abcde”,移动两位变为“deabc”.
编程实现:提示 strcpy函数,或者memcpy函数。
void LoopMove(char *pStr,int nSteps)
{
int n = strlen(pStr) - nSteps;
char temp[Max];
strcpy(temp,pStr +n);
*(pStr + n) = '\0';
strcpy(temp + nSteps,pStr);
strcpy(pStr,temp);
}
7 将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I 。
编程实现:
void strReverse(char *str,int n)
{
int i = 0;
int j = 0;
int begin;
int end;
char temp;
//...............第一步:整体倒置......................//
j = n-1;
while (j>i)
{
temp = str[i];
str[i] = str[j];
str[j] = temp;
i++;
j--;
}
printf("after reversing wholly string = %s\n",str);
//...............第二步:按单词部分倒置......................//
i = 0;
while (str[i]!='\0')
{
if (str[i]!=' ')
{
begin = i;
while ((str[i]!='\0') && (str[i]!=' '))
{
i++;
}
i = i-1;
end = i;
}
while (begin<end)
{
temp = str[begin];
str[begin] = str[end];
str[end] = temp;
begin++;
end--;
}
i++;
}
}
8 求子串在父串中出现的次数。
int caculate(char *str,char *substr)
{
char* str1 = str;
char* substr1 = substr;
int times = 0;
while(*str1!='\0') //遍历整个父串
{
if(*str1 == *substr1)
{
str1++;
substr1++;
if(*substr1 == '\0')
{
substr1 = substr;
times++;
}
}
else
{
str1++;
}
}
return times;
}
回复 onlyoupp:我上个写的也有点不对,应该是这样
else
{
if(1==flag) \\ flag是子串的首字母和父串字符相等的标志位,在while中第一个if下面。
{
substr1=substr; \\子串又变成首字母
flag=0;
}
else
{
str1++;
}
}
经验证,我这么改正确!
我觉得,子串在父串中出现的次数那一题最后有点问题,我说一下您看看对不对。
while循环中的 else应该这么写
{
substr1=substr; \\这个时候又重新从子串的开始与父串比较
str1--; \\ 父串中第二个不相等的字符重新与子串第一个字符开始比较
}
不知道我说的意思您理解了没有