fgets()不能像我期望的那样工作

时间:2015-11-20 22:12:00

标签: c

任何人都可以告诉我为什么这段代码不起作用?当我跑步时,它只是打印出来"输入关于小径1和#34的信息;没有任何输入,跳到另一步。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 15

void readingArrays(int numberOfTrails,char arr[MAX][20]);

char array[MAX][20];

int main(void)
{
    int numberOfTrails;
    printf("Enter the number of trails\n");
    scanf("%d",&numberOfTrails);

    readingArrays(numberOfTrails,array);

    return 0;
}

void readingArrays(int numberOfTrails,char arr[numberOfTrails][20])
{
    for(int i=0;i<numberOfTrails;i++)
    {
        printf("Enter info about trails %d\n",i+1);
        fgets(arr[i],4,stdin);
        //getchar();
        //strtok(arr[i], "\n");
        printf("%s\n",arr[i]);
    }
}

3 个答案:

答案 0 :(得分:2)

<强>问题

main中的scanf函数读取整数,但在输入流上留下换行符\n。当readingArrays的第一次循环迭代出现时,fgets会看到此换行符并假设您已经输入了跟踪信息并按下回车键。它打印空字符串和换行符,然后继续下一次迭代。

<强>解决方案

一种解决方案是通过在%d格式说明符之后添加空格来告诉scanf读取并忽略数字后面的空格。

所以要从stdin获取numberOfTrails,你会做

scanf("%d ",&numberOfTrails);

感谢@Ray指出这个解决方案!

答案 1 :(得分:2)

perl语言为你提供了chomp,它从输入中读取的行中删除了换行符。我发现躺在身边很有用,

char*
chomp(char* p)
{
    if(!p) return p;
    size_t len=strlen(p);
    //if(len<=0) return(p);
    if(len>0) len--;
    if(p[len]=='\n') p[len--]='\0';
    if(len>=0) if(p[len]=='\r') p[len--]='\0';
    return(p);
}

因此,声明一个用于读取一行的变量,然后使用gets来解析该行。负载更清晰。请注意,您的数组是一个MAX [@]数组的数组,您可能会输入更大的行。读取输入的整行,然后提取所需的部分

是有效的
char array[MAX][20];
int ndx;
char line[100];
for( ndx=0; fgets(line,sizeof(line)-1),stdin); ++ndx ) {
    chomp(line);
    strncpy(array[ndx],line,sizeof(array[ndx])-1);
    //combine both into one line:
    //strncpy(array[ndx],chomp(line),sizeof(array[ndx])-1);
    /*NULL termination of array[ndx] left as exercise for reader*/
}

答案 2 :(得分:0)

1)在scanf()之后添加这一行:    的getchar()

2)将fgets(...)改为4到19。

该计划将有效。