Ubuntu下C语言printf读取文件输入时无法打印变量的问题
C语言printf重定向输入异常问题分析与解决
问题根源:跨平台换行符差异导致字符串终止异常
Windows文本文件的换行符是\r\n,Ubuntu则是\n。你的initialze_names函数读取Windows格式的输入文件时,会把\r保留在字符串末尾。当用printf("%s后续字符", name)输出时,\r会让终端光标跳回行首,后续打印的字符直接覆盖了变量内容,看起来像是printf没输出变量。而puts会自动追加换行并处理\r,键盘输入是Ubuntu本地的\n格式,所以两种场景下都能正常工作。
Ubuntu下的可行解决方案
- 去除字符串末尾的
\r:读取输入后,手动截断\r字符#include <string.h> // 假设name是读取到的字符串变量 char *carriage_return = strchr(name, '\r'); if (carriage_return != NULL) { *carriage_return = '\0'; } - 转换输入文件格式:用
dos2unix工具把Windows格式文本转为Ubuntu兼容格式dos2unix your_input_file.txt - 优化读取逻辑:在读取字符时,直接跳过
\r,只保留有效内容int c; int idx = 0; while ((c = getchar()) != EOF && c != '\n') { if (c != '\r') { // 跳过\r字符 name[idx++] = c; } } name[idx] = '\0'; // 确保字符串终止
测试验证
修改代码或转换文件后,执行重定向命令测试:
./your_program < your_input_file.txt
此时printf应该能正常输出变量内容。
内容的提问来源于stack exchange,提问作者roee
相关产品推荐
相关产品推荐

