获取 N 个字符串的输入时出现 fgets() / gets() 问题。在初始位置不接受输入
fgets() / gets() problem while taking input for N strings. Not taking input at initial position
我需要获取 n
(用户输入) 字符串的输入。为此,我首先定义一个二维数组 char str[ ][ ].
我使用 for
循环从用户那里获取输入,并尝试了 gets()
、fgets()
两者。
在代码示例中,尽管我使用了 gets().
但它总是接受 n-1 个字符串的输入,即比用户想要输入的字符串少 1 个。
进一步检查后,我发现程序没有接受 0th string 的输入,即初始字符串。
我的代码:
#include <stdio.h>
int main(void){
int i, n;
printf("how many string you want to enter: ");
scanf("%d", &n);
char str[n][60];
printf("start entering strings:\n ");
for(i=0;i<n;i++){
gets(str[i]); //have used here fgets() also
}
puts(str[0]); //no output for Oth string
return 0;
}
输出:
how many string you want to enter:
用户输入 - 3
how many string you want to enter: 3
start entering strings:
最终输出:
how many string you want to enter: 3
start entering strings:
abc
bcd
此处程序在仅输入 2 个字符串并且不为 puts(str[0]);
提供任何输出后终止
尽管使用 scanf()
作为 scanf("%s", str[i]);
的输入工作得很好。
我想知道为什么使用 gets()
、fgets()
没有工作.
您需要消耗 scanf
留下的剩余缓冲区:
scanf("%d", &n);
char str[n][60];
int c;
while ((c = fgetc(stdin)) != '\n' && c != EOF);
printf("start entering strings:\n ");
您可以使用 fgets
和 strtol
而不是 scanf
来避免丑陋的刷新循环:
char buf[32];
int i, n = 0;
printf("how many string you want to enter: ");
if (fgets(buf, sizeof buf, stdin)) {
n = (int)strtol(buf, NULL, 10);
}
char str[n][60];
printf("start entering strings:\n ");
问题不在于 fgets
(或 gets
)。问题是您之前调用 scanf
.
当您使用 Enter 键结束数字输入时,该 Enter 键将被添加到输入缓冲区作为新队。所以在 scanf
读取数字后,输入缓冲区中剩下的下一个字符将是换行符。这是 fgets
将作为空行读取的第一个字符。所以它 确实 读取所有行,但第一行将被视为 空。
这就是为什么您似乎 无法获得任何输出的原因,因为没有可打印的字符可供打印。你得到的只是一个空行。
我需要获取 n
(用户输入) 字符串的输入。为此,我首先定义一个二维数组 char str[ ][ ].
我使用 for
循环从用户那里获取输入,并尝试了 gets()
、fgets()
两者。
在代码示例中,尽管我使用了 gets().
但它总是接受 n-1 个字符串的输入,即比用户想要输入的字符串少 1 个。
进一步检查后,我发现程序没有接受 0th string 的输入,即初始字符串。
我的代码:
#include <stdio.h>
int main(void){
int i, n;
printf("how many string you want to enter: ");
scanf("%d", &n);
char str[n][60];
printf("start entering strings:\n ");
for(i=0;i<n;i++){
gets(str[i]); //have used here fgets() also
}
puts(str[0]); //no output for Oth string
return 0;
}
输出:
how many string you want to enter:
用户输入 - 3
how many string you want to enter: 3
start entering strings:
最终输出:
how many string you want to enter: 3
start entering strings:
abc
bcd
此处程序在仅输入 2 个字符串并且不为 puts(str[0]);
尽管使用 scanf()
作为 scanf("%s", str[i]);
的输入工作得很好。
我想知道为什么使用 gets()
、fgets()
没有工作.
您需要消耗 scanf
留下的剩余缓冲区:
scanf("%d", &n);
char str[n][60];
int c;
while ((c = fgetc(stdin)) != '\n' && c != EOF);
printf("start entering strings:\n ");
您可以使用 fgets
和 strtol
而不是 scanf
来避免丑陋的刷新循环:
char buf[32];
int i, n = 0;
printf("how many string you want to enter: ");
if (fgets(buf, sizeof buf, stdin)) {
n = (int)strtol(buf, NULL, 10);
}
char str[n][60];
printf("start entering strings:\n ");
问题不在于 fgets
(或 gets
)。问题是您之前调用 scanf
.
当您使用 Enter 键结束数字输入时,该 Enter 键将被添加到输入缓冲区作为新队。所以在 scanf
读取数字后,输入缓冲区中剩下的下一个字符将是换行符。这是 fgets
将作为空行读取的第一个字符。所以它 确实 读取所有行,但第一行将被视为 空。
这就是为什么您似乎 无法获得任何输出的原因,因为没有可打印的字符可供打印。你得到的只是一个空行。