为什么printf只打印字符串中的第一个单词?

时间:2015-02-24 04:07:59

标签: c input stream printf fgets

我对C编程很新,所以我正在使用fgets()和sscanf()从文件中读取数据。我在这里设置了一个真正简单的实验:

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

main()
{
    char szInputBuffer[100];
    FILE *pFile;
    char szInput[100];
    int i;

    pFile = fopen("MyFile.txt", "r");
    printf("This is the input: \n\n");

    for (i = 0; i <= 2; ++i)
    {
        fgets(szInputBuffer, 100, pFile);
        sscanf(szInputBuffer, "%s", szInput);
        printf("%s", szInput);
    }
}

我正在阅读MyFile.txt,其中包含:

This is more input.
The next line of Input.
More input here.

我的输出如何:

This is the input:
ThisTheMore

这是每行的第一个单词。我发现当我在printf语句中添加第二个%s时,就像这样:

printf("%s%s", szInput);

我实现了所需的输出:

This is the input:
This is more input.
The next line of Input.
More input here.

有人可以向我解释一下吗?我从来没有听说过使用第二个占位符来获取整个字符串。我在这里找不到任何有助于我的问题的东西。我见过类中的示例程序,它只在print语句中使用一个%s并打印整个字符串。谢谢你帮助一个好奇的程序员!

P.S我正在使用Geany IDE运行Ubuntu 14.04 LTS。我知道有些人会问这个问题。

1 个答案:

答案 0 :(得分:3)

sscanf(szInputBuffer, "%s", szInput);

格式说明符%s获取字符串,直到遇到空格或换行符,因此您只需获取一个单词,以便在fgets()之后将整行替换为fgets() { {1}}附带换行符并打印出字符串。

scanf()男子说%s

  

匹配一系列非空白字符;下一个指针   必须是一个指向字符数组的指针,该数组足够长以容纳   输入序列和添加的终止空字节('\ 0')   自动。输入字符串在空白处或最大处停止   字段宽度,以先到者为准。

待办事项

size_t n;
fgets(szInputBuffer, 100, pFile);
n = strlen(szInputBuffer);
if(n>0 && szInputBuffer[n-1] == '\n')
 szInputBuffer[n-1] = '\0';
 printf("%s\n",szInputBuffer);

如果您希望将该行划分为字符串并打印出一行中的每个单词,请转到strtok(),并将空格作为分隔符。


如果你看到

printf("%s%s", szInput);

然后你所拥有的是undefined behavior.printf()表示格式说明符的数量应该与需要打印的值的数量相匹配。请注意,即使类型不匹配,行为也是未定义的。