不知不觉又换了一个语言了,但是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很多时候必须自己进行码代码处理!