2010-10-26 56 views
5

scanf(「%s」,str)不會這樣做。它會停止在第一個空間閱讀。 當字符串很大時,gets(str)不起作用。有任何想法嗎?如何在C中讀取帶空格的字符串?

+2

'gets'永遠不會奏效。這是使用'gets'的固有缺陷。使用'fgets'。 – 2010-10-26 16:26:08

+0

也許這是我的c版本,不會接受獲取...謝謝! – Johny 2010-10-26 16:28:47

+0

@Johnny:R對使用'gets()'的警告是由於使用它會在你的代碼中引入一個*巨大的安全漏洞,而不是你的特定編譯器有問題(它不應該;'get ()'從一開始就是C的一部分)。 C99已棄用,不應再使用。 – 2010-10-26 19:47:13

回答

13

使用fgets與STDIN作爲文件流。然後,您可以指定要讀取的數據量以及放置位置。

+0

其實就是這樣的: – Johny 2010-10-26 16:25:44

+0

fgets(str1,100,stdin); fgets(str2,100,stdin);我不會被要求輸入第一個字符串。它直接轉到第二個。感謝你及時的答覆。 – Johny 2010-10-26 16:27:36

+0

我不確定你的評論意味着什麼 - 是不是工作? – 2010-10-26 16:32:54

1

你想什麼時候停止閱讀?在EOF,在一個特定的角色,或什麼?

可以讀取與%C的字符的特定數目

c匹配的寬度 計數字符(默認值1)的序列;下一個 指針必須是指向char的指針,並且對於所有字符必須有足夠的空間 (不添加終止NUL)。領先的白色空間的通常的 跳過被抑制。首先,跳過空白 ,在格式中使用顯式空格。

可以讀取特定的字符(或至多排除那些)與%[

[匹配的從指定的組的 接受字符 字符的非空序列;下一個指針必須是指向 char, 的指針,並且 字符串中的所有字符必須有足夠的空間, 加上終止的NUL字符。領先的空白的通常跳過被抑制。該字符串將由 中的 (或不在)特定集合中的字符組成;該集合由開放括號[字符和右括號]之間的 字符 定義。如果第一個 字符 在開放括號之後是一個旋轉曲線^,則該集合將排除這些字符。若要在該組中包含一個接近的 支架,使其成爲支架或旋轉支架打開後的第一個字符;任何其他職位都將結束。 連字符 - 也是特殊的;當放置在兩個 其他字符之間時,它會將所有干預字符添加到該集合中。 要包含連字符,請將其作爲最後一個字符,然後放在最後一個關閉括號內。例如,`[^] 0-9-]'表示除了括號,0到9和連字符''外的所有設置 ``全部 。該 串 與性格沒有在外觀結束(或者,用 西爾 cumflex中)設置或當字段寬度耗盡

+0

我只是不希望空白在字符串之間。我試過scanf(「%[^ \ n]」,str);但也沒有工作。不管怎麼說,還是要謝謝你! – Johny 2010-10-26 16:31:03

+0

所以你想讀一整行? – 2010-10-26 16:32:47

+0

我猜這意味着高達79個字符,對吧?我需要一個可能更大的字符串。 – Johny 2010-10-26 16:38:50

2

創建自己的函數讀取一行。這裏就是你基本上要做到:

 
1. fgets into allocated (growable) memory 
2. if it was a full line you're done 
3. grow the array 
4. fgets more characters into the newly allocated memory 
5. goto 2. 

的實現可以是有點棘手:-)

你需要考慮你需要什麼傳遞給你的函數(至少是地址數組及其大小);以及當一切「有效」或出現錯誤時函數返回的內容。你需要決定什麼是錯誤(是一個10G字節的字符串,沒有'\ n'錯誤?)。您需要決定如何增長陣列。


編輯

實際上,它可能是更好的fgetc而非fgets

 
get a character 
it it EOF? DONE 
add to array (update length), possible growing it (update size) 
is it '\n'? DONE 
repeat 
1

要與空間讀取字符串,你可以做如下:

char name[30],ch; 

i=1; 
while((ch=getchar())!='\n') 
{ 
name[i]=ch; 
i++; 
} 
i++; 
name[i]='\n'; 
printf("String is %s",name); 
+0

'ch'應該是'int'來區分'EOF'和其他'char'。現在,'while((ch = getchar())!='\ n')'是一個無限循環,如果EOF從getchar()返回。 – chux 2015-01-10 18:58:01

4
char str[100]; 

試試這個

scanf("%[^\n]s",str); 

或本

fgets(str, sizeof str, stdin)) 
+0

1)在''%[^ \ n] s「'中沒有's'的理由。 2)'scanf(「%[^ \ n] ...'不會掃描任何東西,如果輸入是'」\ n「',則不會在'str'中保存任何內容3)'scanf(」%[^ \ n] .. .'不能防止大的輸入。4)'scanf(「%[^ \ n] ...'在'stdin'中留下'\ n''。 – chux 2015-01-10 18:53:40