2013-10-08 132 views
0

我對C相當陌生,而且閱讀過C書的幾章,現在我必須做一個任務,但我我都很困惑,希望有人能幫助我。如何從C中的用戶輸入中讀取字符串,放入數組並打印

我必須從最大長度爲100個字符的用戶(字符數組)輸入中讀取2個字符串,並將它們轉換爲大寫字母,並在每個單詞後用換行符打印出來。

到現在爲止我有這樣的:

int main() { 
char chars[100]; 
int i = 0; 
char str1; 
char str2; 
int j = 0; 

scanf("\n %c", str1); 
scanf("\n %c", str2); 


while (str1[i] != '\0') { 

    chars[i] = str1[i]; 
    toupper(chars[i]); 
    printf(chars[i]); 
    i++; 

} 

while (str2[j] != '\0') { 

    chars[j] = str2[j]; 
    toupper(chars[j]); 
    printf(chars[j]); 
    j++; 

} 


return 0; 
} 

從用戶需要2個輸入後,它說停止運行並表示運行失敗。

+1

'str1'和'str2'應該是數組 –

+0

虐待嘗試...沒有任何區別,因爲它仍然停止輸入後 – Burbanana

+1

您的編譯器沒有給出任何警告,對吧?哦,等待noez ... – 2013-10-08 17:19:57

回答

2

這是你的直接問題:

scanf("\n %c", str1); 

此格式字符串告訴scanf閱讀後面的一個字符,將被存儲在str1空白的一些量。

@ H2CO3正確:scanf幾乎從來都不是讀取用戶輸入的正確答案。它不執行邊界檢查,對用戶輸入的格式太過挑剔;一個意想不到的角色會完全混淆它。你是非常強烈建議使用fgets,而不是如果可能的話:

fgets(str1, 100, stdin); 

如果不允許這樣做,你應該問你的教授爲什麼不呢?認真。

如果您絕對必須使用scanf來閱讀這裏的輸入內容,您可以按@ user2479209在他們的答案中描述的方式進行操作。

您的程序存在另一個問題,即toupper(chars[i])不會更改存儲在chars[i]中的值。你要的toupper結果分配回陣列明確,例如:

chars[i] = toupper(chars[i]); 
2

將str1和str2更改爲數組。在前兩個scanf中使用%100 [^ \ n]。這是一個用空格讀取字符串的正則表達式技巧。

char str1[101]; 
char str2[101]; 
scanf("%100[^\n]",str1); 
scanf("%100[^\n]",str2); 

這將需要兩個strings.hit輸入第一個字符串後輸入第二個。

+0

歡迎您向他展示一些代碼示例... – Liel

0

我認爲你也可以使用scanf_s(安全scanf函數),並收集用戶輸入的字符串都在一杆。您還可以將數組大小定義爲靈活性的符號常量,位於yoru程序的頂部,在#include preprocesor指令的主要和之外。 //符號常量

限定SIZE 101

炭STR1 [101];

char str2 [101]; (「%100s%100s」,str1,SIZE,str2,SIZE);以及其他數據。

或者: scanf_s(「%100s」,str1,SIZE); 012fscanf_s(「%100s」,str2,SIZE);

我認爲,如果你不想做的#define SIZE 101 你也可以這樣做:

scanf_s( 「%100S」,STR1,101);

scanf_s(「%100s」,str2,101);

我是C新手,請隨時提出寶貴意見。 關於這個主題, 任何人都知道如何將用戶提供的字符串一個接一個地循環保存,並將每個字符串保存在一個數組中。我想我需要使用指針,但我一直無法找到這方面的幫助。謝謝。

+0

您自己的問題最好作爲單獨問題詢問。 – dash2

相關問題