更正一下,是调用 strlen(string)+1 次
for(i=0;i<strlen(string);i++)你可能以为这里的strlen(string)只调用了一次,但实际上是调用了strlen(string)+1次,对于一个小程式可能是没多大影响,但如果在大的程序中多次调用fun或者你有多个类似的for(;;)影响就大了.而可能会造成错误(当string指针在for()被移动,就会有错误的结果)。
受教了!
[此贴子已经被作者于2004-10-02 20:16:30编辑过]
更正一下,是调用 strlen(string)+1 次
for(i=0;i<strlen(string);i++)你可能以为这里的strlen(string)只调用了一次,但实际上是调用了strlen(string)+1次,对于一个小程式可能是没多大影响,但如果在大的程序中多次调用fun或者你有多个类似的for(;;)影响就大了.而可能会造成错误(当string指针在for()被移动,就会有错误的结果)。
受教了!
[此贴子已经被作者于2004-10-02 20:16:30编辑过]
knocker:还有,空前的第二个程序不能正确处理汉字,并且还应考虑汉字与ASCII混合使用的情况。
改一下:
#include<string.h>
int fun(char *string,char *str) {int i,j,k,n=0; int a=strlen(string),b=strlen(str); for(i=0;i<a;i++) {k=i; for(j=0;j<b;j++) if(*(string+k)==*(str+j)) {k++;continue;} else break; if(j>=strlen(str)) { n++;i=k-1;} } return n; }
这样应该可以了吧,我也想了一下上面的那个函数还不能处理这样的字符串:
fun("aaa","aa")
如果是这样的话就变成2了,改了之后应该没问题吧!
你测试一下下面的数据:
char *string="中华人民共和国"; char *str="凸";
knocker:还有,空前的第二个程序不能正确处理汉字,并且还应考虑汉字与ASCII混合使用的情况。
改一下:
#include<string.h>
int fun(char *string,char *str) {int i,j,k,n=0; int a=strlen(string),b=strlen(str); for(i=0;i<a;i++) {k=i; for(j=0;j<b;j++) if(*(string+k)==*(str+j)) {k++;continue;} else break; if(j>=strlen(str)) { n++;i=k-1;} } return n; }
这样应该可以了吧,我也想了一下上面的那个函数还不能处理这样的字符串:
fun("aaa","aa")
如果是这样的话就变成2了,改了之后应该没问题吧!
觉得应该是i=k-b
补充一点汉字编码的知识
GB2313-80标准
1。汉字有两个字节组成:
2。第一个字节等于该汉字的区码加0xa0;第二个字节等于该汉字的位码加0xa0;
不好意思,我理解错了,我以为是模式匹配,
要是"AAA" "AA"输出1的话 应该是K-1;
"AAA" "AA"输出2的话 是K-B或不写
有个问题,string 是个指针, 不是个常量吗???指向第一个元素所存放的地址,没错吧?
那怎么可以用strlen(string)这样的形式吗??
我写了如下程序,大家指教一下:
int fun(char *string, char c)
{int n=0;
char * pf;
pf=string;
while(*pf!=null)
{ if(*pf==c){n++;pf++)
else pf++;
}
return n;
}