2015-02-24 57 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

相關問題