如何在循环中使用 fgets?
How to use fgets in a loop?
我想在这里使用循环。但是我的第二个 fgets 不能正常工作!
在第一个循环中没关系!但之后它会跳过它的第二个 fgets!
如何解决?
谢谢
#include<stdio.h>
#include<string.h>
int main (void)
{
char first_line[1000];
char second_line[2];
int i,n,j,k;
int count=0,flag=0;
scanf("%d ",&k);
for(int m=0; m<k; m++)
{
fgets(first_line, 1000, stdin);
fgets(second_line, 2, stdin);
for(i=0; i<strlen(first_line); i++)
{
if(second_line[0]==first_line[i])
{
flag=1;
count++;
}
}
first_line[strlen(first_line)-1] = '[=10=]';
if(flag==1)
printf("Occurrence of '%c' in %s = %d",second_line[0],first_line,count);
else
printf("%c isn't present",second_line[0]);
count=0;
flag=0;
}
return 0;
}
问题是数组 second_line
被声明为只有两个元素。
char second_line[2];
因此在这次调用之后
fgets(second_line, 2, stdin);
无法容纳仍将保留在输入缓冲区中的换行符。由于输入缓冲区中存在换行符,fgets
的第一次调用读取了一个空字符串。
至少你应该写
char second_line[3];
//...
fgets(second_line, sizeof( second_line ), stdin);
考虑到通常这种从字符串中删除换行符的方法是错误的
first_line[strlen(first_line)-1] = '[=13=]';
因为字符串不一定确实包含换行符。
改为
first_line[ strcspn( first_line, "\n" ) ] = '[=14=]';
第二行在本例中实际上是一个字符。 C 中有 fgetc() 接受一个字符。在这种情况下,可以使用它代替 fgets()。除了第二行的 fgets() 问题外,scanf("%d ", ) 语句也存在问题。格式说明符后的 space 会导致您没有预料到的行为。同样输入数值后输入的换行符也会导致跳过提示行为。
这可能不是最好的解决方案,但下面的代码解决了这种跳过提示的行为。在 scanf() 和 fgetc() 之后有 fgets(caGarbage, sizeof caGarbage, stdin) 语句。此语句使用换行符,从而解决了这种跳过提示的行为。
#include<stdio.h>
#include<string.h>
int
main(void)
{
char first_line[1000];
char cC;
char caGarbage[50];
int i,n,j,k;
int count=0,flag=0;
printf("Enter count:");
scanf("%d",&k);
fgets( caGarbage, sizeof caGarbage, stdin);//Consumes newline character.
for(int m=0; m<k; m++)
{
printf("Insert first line:");
fgets(first_line, 1000, stdin);
printf("Insert a character:");
cC = fgetc( stdin );
fgets( caGarbage, sizeof caGarbage, stdin); //Consumes newline character
for(i=0; i<strlen(first_line); i++)
{
if(cC == first_line[i])
{
flag=1;
count++;
}
}
first_line[strcspn( first_line, "\n" )] = '[=10=]';
if(flag==1)
printf("Occurrence of '%c' in %s = %d",cC,first_line,count);
else
printf("%c isn't present",cC);
printf("\n");
count=0;
flag=0;
}
return 0;
}
你不了解scanf()和fgets()的细节
当您从键盘输入一系列字符时,这些字符保存在 inputbuf 中而不是您的进程。当你输入 [Enter] 时,inputbuf 中的字符被发送到你的进程(第一个是 scanf(),第二个是 fgets()),scanf() 可以选择数字,space 键形成 inputbuf .但它跳过 Enter 并停止,所以 '\n' 仍在 inputbuf 中,但 fgets() 没有。 fgets() 获取 inputbuf 中的任意字符,包括 ' ' 和 '\n'(它在获取 '\n' 时停止)。
当您同时使用它们时,scanf() 和 fgets() 之间的区别很烦人。
我想在这里使用循环。但是我的第二个 fgets 不能正常工作!
在第一个循环中没关系!但之后它会跳过它的第二个 fgets!
如何解决?
谢谢
#include<stdio.h>
#include<string.h>
int main (void)
{
char first_line[1000];
char second_line[2];
int i,n,j,k;
int count=0,flag=0;
scanf("%d ",&k);
for(int m=0; m<k; m++)
{
fgets(first_line, 1000, stdin);
fgets(second_line, 2, stdin);
for(i=0; i<strlen(first_line); i++)
{
if(second_line[0]==first_line[i])
{
flag=1;
count++;
}
}
first_line[strlen(first_line)-1] = '[=10=]';
if(flag==1)
printf("Occurrence of '%c' in %s = %d",second_line[0],first_line,count);
else
printf("%c isn't present",second_line[0]);
count=0;
flag=0;
}
return 0;
}
问题是数组 second_line
被声明为只有两个元素。
char second_line[2];
因此在这次调用之后
fgets(second_line, 2, stdin);
无法容纳仍将保留在输入缓冲区中的换行符。由于输入缓冲区中存在换行符,fgets
的第一次调用读取了一个空字符串。
至少你应该写
char second_line[3];
//...
fgets(second_line, sizeof( second_line ), stdin);
考虑到通常这种从字符串中删除换行符的方法是错误的
first_line[strlen(first_line)-1] = '[=13=]';
因为字符串不一定确实包含换行符。
改为
first_line[ strcspn( first_line, "\n" ) ] = '[=14=]';
第二行在本例中实际上是一个字符。 C 中有 fgetc() 接受一个字符。在这种情况下,可以使用它代替 fgets()。除了第二行的 fgets() 问题外,scanf("%d ", ) 语句也存在问题。格式说明符后的 space 会导致您没有预料到的行为。同样输入数值后输入的换行符也会导致跳过提示行为。 这可能不是最好的解决方案,但下面的代码解决了这种跳过提示的行为。在 scanf() 和 fgetc() 之后有 fgets(caGarbage, sizeof caGarbage, stdin) 语句。此语句使用换行符,从而解决了这种跳过提示的行为。
#include<stdio.h>
#include<string.h>
int
main(void)
{
char first_line[1000];
char cC;
char caGarbage[50];
int i,n,j,k;
int count=0,flag=0;
printf("Enter count:");
scanf("%d",&k);
fgets( caGarbage, sizeof caGarbage, stdin);//Consumes newline character.
for(int m=0; m<k; m++)
{
printf("Insert first line:");
fgets(first_line, 1000, stdin);
printf("Insert a character:");
cC = fgetc( stdin );
fgets( caGarbage, sizeof caGarbage, stdin); //Consumes newline character
for(i=0; i<strlen(first_line); i++)
{
if(cC == first_line[i])
{
flag=1;
count++;
}
}
first_line[strcspn( first_line, "\n" )] = '[=10=]';
if(flag==1)
printf("Occurrence of '%c' in %s = %d",cC,first_line,count);
else
printf("%c isn't present",cC);
printf("\n");
count=0;
flag=0;
}
return 0;
}
你不了解scanf()和fgets()的细节
当您从键盘输入一系列字符时,这些字符保存在 inputbuf 中而不是您的进程。当你输入 [Enter] 时,inputbuf 中的字符被发送到你的进程(第一个是 scanf(),第二个是 fgets()),scanf() 可以选择数字,space 键形成 inputbuf .但它跳过 Enter 并停止,所以 '\n' 仍在 inputbuf 中,但 fgets() 没有。 fgets() 获取 inputbuf 中的任意字符,包括 ' ' 和 '\n'(它在获取 '\n' 时停止)。
当您同时使用它们时,scanf() 和 fgets() 之间的区别很烦人。