为何我的C语言程序无法输出字符串?read_line()作业问题求助
你的C语言输入程序问题解析
别担心,作为C语言新手遇到这种问题太正常啦!咱们一点点拆解你的代码里的问题,帮你搞定它~
1. 最致命的问题:局部数组的「过期内存」
你在read_line函数里定义了char tempBuf[sz];,这是个局部变量——简单说就是它只在read_line函数运行的时候存在,函数一执行完,这块内存就会被系统收回去复用。你最后把buf = tempBuf;然后返回,相当于返回了一个已经“失效”的地址,后续用这个地址打印,要么啥都出不来,要么程序直接崩溃,这种行为在C里叫「未定义行为」。
2. 指针参数的使用错误
你在main里声明了char *buf;,但这个指针根本没指向任何有效的内存空间(业内叫「野指针」)。而且在read_line里直接给buf赋值buf = tempBuf;也没用——C语言的函数参数是值传递,你传进去的是指针的“副本”,修改副本不会影响main里那个原指针的指向。
3. 字符读取的逻辑bug
你写的判断条件if (tempBuf[pos] == EOF || tempBuf[pos] == '\n')完全搞反顺序了:你还没把刚读到的c存到tempBuf[pos]里,就去判断这个位置的内容,这时候tempBuf[pos]是随机的垃圾值,根本不是你要读的字符!
另外,getchar()返回的是int类型,不是char——因为EOF是一个比char范围大的特殊值,用char存会导致无法正确识别EOF。
修复后的可运行代码
咱们保留你用read_line函数的要求,把所有问题都改过来:
#include <stdio.h> #include <stdlib.h> char *read_line(char *buf, size_t sz) { int c; // 用int存getchar的返回值,才能正确识别EOF int pos = 0; printf("> "); // 要留一个位置存字符串结束符'\0',所以最多读到sz-1的位置 while (pos < sz - 1) { c = getchar(); // 先判断读到的字符,再决定要不要存 if (c == EOF || c == '\n') { break; // 遇到换行或结束符,停止读取 } buf[pos] = (char)c; pos++; } // 必须给字符串加结束符'\0',否则printf会乱读内存 buf[pos] = '\0'; return buf; // 返回传入的有效buf地址 } int main(int argc, char **argv) { char buf[128]; // 直接定义一个固定大小的数组,有合法的内存空间 char *input = read_line(buf, sizeof(buf)); printf("Here: %s\n", input); return 0; }
新手必记的几个关键点
- 局部变量别乱返回:函数里定义的变量,函数结束就没了,返回它的地址等于给了个无效的“空房间钥匙”。
- 字符串必须以
'\0'结尾:printf("%s")全靠这个符号判断什么时候停止打印,没有它就会一直读内存直到出错。 getchar()用int存:EOF是一个特殊的整数值,用char存会被截断,导致无法正确判断输入结束。- C的参数是值传递:要修改外面的变量,要么直接往传入的内存里写,要么用指针的指针(这个新手可以先不用急着掌握)。
内容的提问来源于stack exchange,提问作者Jake Jackson
相关产品推荐
相关产品推荐

