2013-08-03 66 views
1

我使用的變量數量有限,所以我想僅使用一個變量來解決以下問題。可能嗎?將三個字完全讀入一個字符數組中

char str[100]; 
    // Type three words: 
    printf("Type three words: "); 
    scanf("%s %s %s",str,str,str); 
    printf("You typed in the following words: \"%s\", \"%s\" and \"%s\"\n",str,str,str); 

下面的輸入提供了以下的輸出:

Type three words: car cat cycle 
You typed in the following words: "cycle", "cycle" and "cycle" 

自上次讀出字存儲到同一個字符數組的開始這是不是很奇怪。有沒有簡單的解決方案?

+2

多少個變量是你允許使用?這是家庭作業還是減少變量試圖解決一個未闡明的基本問題(例如堆棧溢出)? – simonc

回答

2

您正在將每個單詞分配到緩衝區的相同地址,因此它們將首先被汽車覆蓋,然後由貓覆蓋,最後由循環覆蓋。

嘗試使用二維數組,一維是它包含哪個單詞,另一個是它將容納多少個字符,21個用於20個字符和一個零終止。

char str[3][21]; 
// Type three words: 
printf("Type three words: "); 
scanf("%s %s %s",str[0],str[1],str[2]); 
printf("You typed in the following words: \"%20s\", \"%20s\" and \"%20s\"\n",str[0],str[1],str[2]); 

此代碼不會讀取超過20行的字,從而防止溢出緩衝區和內存訪問衝突。 scanf格式字符串%20s將讀數限制爲20個字符。

+4

您可以將格式說明符更改爲'%20s'來限制寫入的字符串的最大長度。 – simonc

+0

是的,我即將測試它 – nio

+0

在這個線程很多很好的答案。我選擇了這個,因爲它是最簡單的一個。用可行的解決方案給其他人+1。 – user1319951

0

你說你只能使用一個變量。而不是讓一個變量爲單個字符串(字符數組),使它成爲一個字符串數組(char數組)。

1

如果你知道的話多久都可以,你可以做這樣的事情:

scanf("%s %s %s",str,&str[30],&str[70]); 

並顯示它:

printf("You typed in the following words: \"%s\", \"%s\" and \"%s\"\n",str,str[30],str[70]); 

,但它不是真正的優雅和安全。

1

這是一個糟糕的方式,但仍:如果輸入名字都保證有字母少於一定數量時,就像9

只需使用隨機尺寸輸入字符串

char str[100]; 
    // Type three words: 
    printf("Type three words: "); 
    scanf("%s %s %s",str,str+22,str+33); 
    printf("You typed in the following words: 
      \"%s\", \"%s\" and \"%s\"\n",str,str+22,str+33); 
0

,你可以使用這個:

printf("Type three words: "); 
scanf("%s %s %s",str,str + 10,str + 20); 
printf("You typed in the following words: \"%s\", \"%s\" and \"%s\"\n",str, str + 10, str + 20); 
3

使用循環?

char buf[0x100]; 

for (int i = 0; i < 3; i++) { 
    scanf("%s", buf); 
    printf("%s ", buf); 
} 

旁註:但是爲什麼不一次讀整行,然後使用e來解析它。 G。 strtok_r()

fgets(buf, sizeof buf, stdin); 

是要走的路...

+0

+1由於循環應該是第一個考慮的選項,因此只能看到1個循環的回答令人傷心。另外,'fgets()'一次性解決了I/O和緩衝區溢出問題。 – chux

+0

@chux是的,接受的答案是簡單的**。** :-( – 2013-08-03 13:48:32

+0

順便說一句,OP有100,你有0x100 - 你的標準緩衝區大小。 – chux

0

你可以使用2-d數組:

char str[3][30]; 

printf("Type three words: "); 
scanf("%s %s %s", str[0], str[1], str[2]); 

printf("You typed in the following words: \"%s\" \"%s\" \"%s\"\n", str[0], str[1], str[2]); 
相關問題