首页 > 解决方案 > fgets 不接受最后一个值?

问题描述

我有一个家庭作业问题:-

1)用户将输入他想输入的名字的数量。

2) 然后他会输入这些名字。

3)我们必须打印这些名字。

这是我为上述问题编写的代码:-

# include <stdio.h>
# include <stdlib.h>
# include <stdbool.h>

int main()
{
    int n; // number of names user wants to input.
    scanf("%d", &n);

    char *array[n]; //creating an array of pointers.

    int i;
    for(i = 0; i < n; i++)
    {
        array[i] = malloc(21*sizeof(char)); // allocating memory to each pointer.
    }

    for(i = 0; i < n; i++)
    {
        fgets(array[i], 21, stdin); //getting the values.
    }

    for(i = 0; i < n; i++)
    {
        printf("%s", array[i]); // printing those values.
    }
    return 0;
}

上面代码的问题是它没有打印用户输入的最后一个值。

示例:示例输入:-

5
raj
chris
ben
abhay
gautam

预期输出:-

raj
chris
ben
abhay
gautam

我的输出: -

raj
chris
ben
abhay

编辑:

更改此行后: -

scanf("%d", &n);

scanf("%d ", &n);

它工作正常。

标签: cscanfnewlinefgetsc-strings

解决方案


scanf("%d", &n);一个在输入流中留下一个换行符,因此您读取的第一个字符串fgets只是一个换行符。在阅读名称之前,您需要删除该换行符。

如果你改变

for(i = 0; i < n; i++)
{
    printf("%s", array[i]); // printing those values.
}

for(i = 0; i < n; i++)
{
    printf("String %d : |%s|", i, array[i]); // printing those values.
}

很容易看到...

你会得到输出:

String 0 : |
|String 1 : |raj
|String 2 : |chris
|String 3 : |ben
|String 4 : |abhay
|

注意第一个字符串只是一个换行符......

我通常的建议是......不要使用scanf(用于读取数字)。这似乎是一个非常简单的功能,但它真的很难使用并且会导致很多错误。而是使用fgets后跟sscanf. 此外,您应该检查sscanf/scanf实际返回 1。


推荐阅读