自定义gets()/puts()替代函数的C程序输出垃圾字符,原因何在?
你的字符串为啥带垃圾字符?原因和修复方案来了!
嘿,兄弟,我看了你的代码,立马就明白为啥输出会带垃圾字符了——你的自定义xgets()函数没给字符串加C语言字符串必须的终止符'\0'!
C语言里所有处理字符串的逻辑(不管是标准库的puts()还是你自己写的xputs()),都是靠'\0'来识别字符串结束位置的。如果没有这个标记,程序就会顺着内存一直读,直到碰巧碰到一个'\0'为止,中间读出来的那些乱七八糟的内容就是你看到的垃圾字符。
再仔细看你的xgets()代码:
- 你循环读取字符,直到碰到换行符
'\n'就跳出,但你既没把这个换行符替换成'\0',也没在字符串末尾补上这个终止符。 - 还有个小语法错误:
else break...这里应该写成else break;
给你改好的xgets()函数,两种写法都可以:
写法一:碰到换行符直接替换成终止符
void xgets(char *a) { printf("Enter string\n"); while(1) { scanf("%c", a); if(*a != '\n') { a++; } else { // 把换行符换成字符串终止符,结束循环 *a = '\0'; break; } } }
写法二:循环结束后手动添加终止符
void xgets(char *a) { printf("Enter string\n"); while(1) { scanf("%c", a); if(*a != '\n') { a++; } else { break; } } // 在字符串末尾补上终止符,覆盖掉刚才读取的换行符 *a = '\0'; }
另外还要提醒你:现在这个xgets()和原版gets()一样有缓冲区溢出的风险——如果用户输入的字符串长度超过你定义的str[25],就会越界写内存,搞不好会出大问题。最好给xgets()加个长度限制,比如这样:
void xgets(char *a, int max_len) { printf("Enter string\n"); int i = 0; // 留一个位置给终止符,所以最多读max_len-1个字符 while(i < max_len - 1) { scanf("%c", &a[i]); if(a[i] == '\n') { break; } i++; } // 无论如何都要加终止符 a[i] = '\0'; }
然后在main()里调用的时候改成xgets(str, 25);就安全多啦!
内容的提问来源于stack exchange,提问作者Swapnil Jain
相关产品推荐
相关产品推荐

