我正在编写一个基本程序来学习如何在 C 中使用基本输入/输出,并且它运行得很好。我遇到的唯一问题是,当它打印时,终端上的字符串末尾有一个“%”。这是我的代码:
#include <stdio.h>
int main(int argc, char **argv) {
char name[32];
printf("Enter your name: ");
scanf("%s", name);
printf("Hello, %s", name);
return 0;
}
当我运行程序时,输出是
Hello, Andrew%
有什么帮助吗?
您的代码中没有任何内容可以解释这种行为。但是,如果您从 shell 运行此命令,那么这可能是您的 shell 提示符。
在输出中添加换行符:
printf("Hello, %s\n", name);
这应该会导致提示按照您的预期打印在下一行。
stdout
流是行缓冲的。这意味着在输出换行符或缓冲区已满之前,输出不会出现在控制台上。这可能是您在屏幕上看到 %
的原因。 '\n'
使 printf
立即在屏幕上打印输出。
请注意,如果输入字符串大于
31
个字符,则 scanf
将溢出缓冲区 name
调用未定义的行为。这可能会由于段错误而导致程序崩溃。您应该通过提供最大字段宽度来防范它,该宽度应比数组长度小 1,以容纳由 scanf
添加的终止空字节。
#include <stdio.h>
// if your not using command line argument, use the below
// signature of main
int main(void) {
char name[32];
printf("Enter your name: \n"); // add a newline to output
scanf("%31s", name); // -1 for the terminating null byte
printf("Hello, %s\n", name); // add a newline to output
return 0;
}
由于您尚未输出新行 - 即您的 shell 提示字符在指定输出之后显示。试试
printf("Hello, %s\n", name);
在您的 zsh shell 中运行此命令行
PROMPT_EOL_MARK=''
,这应该足以修复它。
PROMPT_EOL_MARK=''
将此行添加到您的 .zshrc 文件中。