幾個問題:
永遠永遠永遠永遠永遠永遠使用gets
。首先,它從C99開始不再使用,並且將從標準的下一版本中消失。其次,它將在你的代碼中引入了一個故障點(不是可能是介紹,會介紹)。改爲使用fgets(str, sizeof str, stdin)
代替gets(str)
。
使用字符常量,而不是數值,因爲所有的世界不是ASCII:
if (str[i] == ' ') // not str[i] == 32
空白包括標籤,換頁,返回等,而不僅僅是空間;而不是檢查單個值,請使用庫函數isspace()
。
以下行是一個問題:
str[i++] = str[i];
str[i] = str[i++];
首先,這應該調用未定義的行爲;您正試圖在序列點之間多次讀取和更新一個對象。其次,我不確定這個邏輯。看起來你正在嘗試交換元素,而不是僅僅跳過一個元素。
你傳遞一個整數值到strlen
:這是行不通的。它會將該整數值解釋爲一個地址(至少應該得到一個警告),結果可能不好。
您可以在一個循環有兩個數組索引做到這一點:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char str[15];
if (fgets(str, sizeof str, stdin) != NULL)
{
size_t r, w;
printf("Original: \"%s\"\n", str);
/**
* str[r] is the element that we are reading; str[w]
* is the element that we are writing
*/
for (r = 0, w = 0; str[r] != 0; r++)
{
if (!isspace(str[r])) // if str[r] is not a whitespace character
str[w++] = str[r]; // write it to str[w]; note that we only
// advance w for non-whitespace chars
}
str[w] = 0; // add the 0 terminator at the end
printf("Stripped: \"%s\"\n", str);
}
return 0;
}
顯然,這改變了原來的字符串。如果由於某種原因需要保留原始輸入,則必須聲明第二個緩衝區來保存修改過的字符串。
哪些您發佈的當前代碼的缺點? – 2011-03-31 14:35:34
它沒有工作。 str [strlen(i)] ='\ 0';將str [strlen(str)] ='\ 0'; – yEL155 2011-03-31 14:37:29
作業?沒問題,如果是這樣,只需用標記標記,以便得到更好的答案 – pmg 2011-03-31 14:50:37