不知不觉又换了一个语言了,但是python我也没有放弃的,只是觉得以后用c做底层开发,python做前端的开发,两者结合才是极好的,最重要的是,尼玛如果linux or unix 是python开发的,我是打死都不想学c啊有木有!

最近在看Head First C这部书,悲催的没有中文版,只能啃英文版的,但是这还好,哥有大把翻译软件以及google,忽然也觉得看得不亦乐乎的。

以下是看书里面的一段小程序,但是我在自己的机子上面去不通过了,找了同事问了一下,终于知道是什么问题了,记录下:


#include <stdio.h>

#include <string.h>

char tracks[][80] = {

"I left my heart in Harvard Med School\n",

"Newark, Newark - a wonderful town",

"Dancing with a Dork",

"From here to maternity",

"The girl from Iwo Jima",

};


void find_track(char search_for[])

{

int i;

for(i=0;i<5;i++)

{

if(strstr(tracks[i],search_for))

{

printf("Track %i:'%s'\n",i,tracks[i]);

}

}

}


int main()

{

char search_for[80] = {0};

puts("search for: ");

fgets(search_for,80,stdin);

int n = strlen(search_for);

printf("%d",n);

search_for[n-1] = '\0';

//char ss[80];

//strncpy(ss,search_for,n-1);

//char ss[80];

//snprintf(ss,n-1,"%s",search_for);

find_track(search_for);

//find_track(ss);

return 0;

}


注释的部分是各种解决这个问题的方法,下面可以说一下:

在没有添加注释部分的时候直接编译后,再运行是没有办法找到结果了,也就是返回了null!

才发现c中的fgets在获取输入的时候会把最好的"\0"结束符也算进去了,如:输入from,理论strlen(from)=4才符合我们的认知,可是c的fgets出来的是from\0,strlen(from\0)=5了,很明

显我要找4个字符,却给了5个字符,一匹配肯定是匹配不出来了。

程序中的search_for[n-1] = '\0',相当于把字符长度给缩短了1,也就是把结束符都放到提前一位,这样就可以匹配到了。

程序中

//char ss[80];

//strncpy(ss,search_for,n-1);

就是先定义一个新的arry ss,然后用strcpy讲search_for的n-1的字符赋予ss,实际上也是实现了字符串的截取。

同样

//char ss[80];

//snprintf(ss,n-1,"%s",search_for);

也是一样的道理。

总结一下,c还是真的验证很多人所说的坑爹无止境啊,一不小心就出错了,很多其他语言这是自动给处理好了,但是c很多时候必须自己进行码代码处理!