C语言程序中printf换行符\n不生效、输出未换行是什么原因
问题原因
你写错了printf的参数传参顺序。
C标准库中printf的第一个参数必须是格式控制字符串,后续参数才是要匹配格式符填充的输出内容。你写的printf(operand1, "%s\n");把待输出的字符数组放到了第一个参数位,格式串反而放到了第二个参数位,属于完全错误的传参。
这种错误写法下的实际执行逻辑:
- 程序会把
operand1里存储的内容当作格式字符串解析,直接输出operand1里的有效字符,因为operand1存的是"99",里面没有任何%开头的格式占位符,所以第二个参数位置的"%s\n"会被直接忽略,你预期的换行自然不会输出。 - 你之前写的
printf(input,"%s\n");也是同样的错误写法,看起来有换行效果只是因为fgets读取用户输入时,会把用户敲的回车符也存入input数组,相当于input本身自带换行,属于歪打正着,并不是代码写对了。 - 另外你的代码还有一个隐藏问题:循环给
operand1赋值后,没有在有效字符末尾添加C字符串要求的结束符\0,这会导致operand1不是合法字符串,输出时会越界读取内存,属于未定义行为。
修正方法
- 调整所有
printf的参数顺序,把格式控制字符串放在第一个参数位置,待输出变量放在格式串之后。 - 提取完
operand1的有效字符后,在当前索引位置手动补字符串结束符\0。
修正后的完整代码:
#include <stdio.h> int main(){ printf("Enter elementary operation:"); char input[32]; fgets(input, sizeof(input), stdin); // 修正printf参数顺序 printf("%s\n", input); char operand1[32]; int i = 0; while(input[i] == '0' || input[i] == '.' || input[i] == '1' || input[i] == '2' || input[i] == '3' || input[i] == '4' || input[i] == '5' || input[i] == '6' || input[i] == '7' || input[i] == '8' || input[i] == '9' || (i == 0 && input[i] == '-')){ operand1[i] = input[i]; i++; } // 补字符串结束符 operand1[i] = '\0'; // 修正printf参数顺序 printf("%s\n", operand1); printf("test"); return 0; }
修正后运行输出符合预期:
Enter elementary operation:99+0 99+0 99 test
内容的提问来源于stack exchange,提问作者Hayden Labrie
相关产品推荐
相关产品推荐

