2015-02-24 55 views
3

我对C编程相当陌生,所以我正在使用fgets()和sscanf()从文件中读取数据。我建立了一个真正简单的实验在这里:为什么printf只打印字符串中的第一个单词?

#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 

是哪个来自每一行的第一个词。我发现,当我添加第二个%s的printf语句像这样:

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

那我实现所需的输出:

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

可有人请给我讲解一下?我从来没有听说过使用第二个占位符来获取整个字符串。我一直没有找到任何有助于解决我的问题。我已经在类中看到了只在打印语句中使用一个%s并且打印整个字符串的示例程序。感谢您帮助一位好奇的程序员!

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

+0

'sscanf'的'%s'说明符表示读取第一个单词。如果你想打印整行,那么就跳过 – 2015-02-24 04:12:25

+0

的步骤,给出比printf的后续参数更多的格式说明符,导致未定义的行为;你不能真正阅读任何事情后 – 2015-02-24 04:15:15

+1

据我所知,你使用sscanf是不必要的。 fgets调用将从文件中检索文本。我会抛弃sscanf并打印出szInputBuffer。 – user3647894 2015-02-24 04:15:53

回答

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

格式说明%s获取字符串直到遇到一个空格或换行字符,所以你是刚开始一个字,以获得整条生产线刚刚NUL终止字符串fgets()fgets()带有一个换行符后字符并打印出字符串。

的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); 

工作,那么你所拥有的是未定义behavior.printf()表示,格式说明符的数量应匹配值的数量需要被打印出来。请注意,即使类型不匹配,行为也是未定义的。

+0

我很了解%s,但是我不明白为什么使用%s%s会生成正确的输出。这是C中的一件事吗?你可以点亮一下吗? – 2015-02-24 04:20:27

+0

@AlejandroZapien我不明白'%s%s'是什么意思,那么你必须有2个变量来扫描你的值,基本上'%s'正在做它做的事情,因为有一个空间它停止扫描 – Gopi 2015-02-24 04:22:31

+0

如果我做了printf(“%s%s”,szInput);它如何生成我想要的确切输入。我鼓励你复制代码,运行它,然后修改printf以让“%s%s”再次运行。无论什么原因,它的工作。这是为什么? – 2015-02-24 04:26:10

相关问题