#define len 100
char sourceString[len];
char command;
int main(void)
{
while (1)
{
printf("\nEnter source: ");
fgets(sourceString, len, stdin); // this gets skipped on second loop.
printf("\nEnter command: ");
scanf(" %c", command)
switch (command)
{
case 'A':
printf("%s", sourceString);
break;
case 'B':
printf("filler");
break;
default:
break;
}
}
return 0;
}
无论im是否使用fgets或scanf,字符串总是在第二个循环中被跳过。我尝试在第二个scanf“%c”上添加一个空格,但是它仍然跳过字符串输入,是的,我试图读取一行然后是一个字符。
scanf( "%*[^\n]" );
scanf( "%*c" );
从输入缓冲区中删除换行符'\ n'。
fgets()
,只是取消引用持有command
的数组以获取第一个字符-确保读取完整行。 [您的问题是scanf()
将'\n'
留在您的输入流中,下一次迭代将由fgets()
进行(因为fgets()
读取并包含输入流中的下一个'\n'
)。这使它看起来像被跳过了fgets()
-并非只是读取了'\n'
留下的scanf()
。
#define len 100
int main(void)
{
char sourceString[len]; /* don't use global variables */
char command[len];
while (1)
{
printf ("\nEnter source: ");
fgets (sourceString, len, stdin); // this no longer skipped in loop.
printf("\nEnter command: ");
fgets (command, len, stdin);
switch (*command)
{
case 'A':
printf("%s", sourceString);
break;
case 'B':
printf("filler");
break;
default:
break;
}
}
return 0;
}
([note:您必须始终检查每个输入函数调用的返回-留给您。请参阅Henry Spencer's 10 Commandments for C Programmers - No. 6 “被警告...”)]
让我知道是否还有其他问题。
while (1)
{
printf("\nEnter source: ");
fgets(sourceString, len, stdin);
printf("\nEnter command: ");
scanf(" %c", &command);
getchar();
/* Rest of the program would follow */
}
printf("\nEnter source: ");
:显示提示。fgets(sourceString, len, stdin);
读取输入行,您应该测试返回值以确保fgets()
成功。printf("\nEnter command: ");
跳过一行并输出新的提示。scanf(" %c", command)
会跳过所有初始空白(包括待处理的换行符),并读取单个字符。但是请注意,由于终端很可能处于char
变量command
的地址,否则将发生未定义的行为。switch
选择要完成的操作,然后循环跳至下一个迭代printf("\nEnter source: ");
:显示提示。fgets(sourceString, len, stdin);
fgets()
立即返回空行,因为上面键入的换行符仍在输入缓冲区中挂起。这是问题。scanf("%*[^\n]"); // read any characters except newline
scanf("%*1[\n]"); // read at most 1 newline character
您必须对scanf()
使用2个单独的调用,因为如果换行符前没有字符,则第一次转换将失败。
#incude <stdio.h> #define LEN 100 int main(void) { char sourceString[LEN]; char command; for (;;) { printf("\nEnter source: "); if (!fgets(sourceString, len, stdin)) break; printf("\nEnter command: "); /* read a single non blank character and discard the rest of the line */ if (scanf(" %c%*[^\n]", &command) != 1) break; /* discard the pending newline if any */ scanf("%*1[\n]"); // of just getchar() switch (command) { case 'A': printf("%s", sourceString); break; case 'B': printf("filler"); break; default: break; } } return 0; }