我正在编写一个简单的代码,我需要输入一个数字n,然后输入n个字符串格式" string int" (例如,你好100)。我使用fgets()
函数来获取字符串输入。代码似乎适用于除第一个迭代之外的所有迭代。第一次迭代似乎有一个cmd的空输入,但其余的迭代运行正常。我尝试过各种功能,例如scanf()
和gets()
,但问题仍然存在。任何人都可以指出这个问题吗?
#include <stdio.h>
#include <stdlib.h>
int main() {
int num_msg, i;
printf("Hello, How many strings should I read?: ");
scanf("%d", &num_msg);
for (i = 0; i < num_msg; i++) {
int child;
char cmd[100], msg[100];
printf("Message %d (<msg> <int>):", i + 1);
if (fgets(cmd, sizeof(cmd), stdin)) {
//printf("cmd %s\n", cmd);
sscanf(cmd, "%s %d %*s", msg, &child); //separates string and int
printf("%s %d \n", msg, child); //prints them
}
}
}
答案 0 :(得分:4)
您需要使用\n
所读取数字后面的scanf()
。
在\n
格式的末尾添加scanf()
是不合适的,因为它会消耗所有空格字符并继续请求输入,直到输入中的非空格字符。
快速而肮脏的方法是将scanf
替换为:
scanf("%d%*c", &num_msg);
%*c
读取单个字符但不存储它。
您还可以将其存储到char
变量中,并验证它确实是'\n'
。
忽略所有字符并包括换行符的通用方法:
scanf("%d", &num_msg);
int c;
while ((c = getchar()) != EOF && c != '\n')
continue;
您还应该检查scanf
的返回值,以验证号码是否已正确转换。