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



我对C编程还很陌生,所以我一直在用fgets()和sscan()从文件中读取数据。我在这里设置了一个非常简单的实验:

#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: nn");
    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。我知道你们中的一些人会问这个问题。

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

格式说明符%s获取字符串,直到遇到空格或换行符为止,因此您只需要获得一个单词即可获得整行。请在fgets()之后终止字符串,因为fgets()带有换行符并打印出字符串。

扫描人员说%s

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

进行

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

如果你想把这一行分成字符串并打印出一行中的每个单词,那么选择strtok(),用空格作为分隔符。


如果你看到

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

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

相关内容

  • 没有找到相关文章

最新更新