實現去除字符串前導空格時,常見三個錯誤:scanf 格式串用 %d 讀字符串、空格計數邏輯正確但移位循環起始索引錯、未處理字符串結束符移動。
char s[100];
scanf("%d", &s); // 錯誤1:%d 讀整數,非字符串;&s 類型錯誤
int p = 0, i;
for (i = 0; s[i]; i++) { // 統計前導空格數 p
if (s[i] == ' ') p++;
else break;
}
for (i = 0; s[i]; i++) { // 錯誤2:從 0 開始覆蓋,會把非空格部分也搞亂
s[i] = s[i + p];
}
printf("%s", s); // 錯誤3:未顯式添加結束符,若原串較長可能殘留
#include <stdio.h>
#include <string.h>
int main() {
char s[100];
scanf("%99[^\n]", s); // 正確1:讀整行(含空格),防緩衝區溢出
// 或用 fgets(s, sizeof(s), stdin); 去掉末尾換行符
int p = 0, i;
while (s[p] == ' ') p++; // 統計前導空格
for (i = p; s[i]; i++) // 正確2:從 p 開始移動,將有效字符前移
s[i - p] = s[i];
s[i - p] = '\0'; // 正確3:補上結束符
printf("%s", s);
return 0;
}
scanf("%s") 遇空格停止,無法讀取含空格字符串。用 %[^\n] 讀到換行,或 fgets 更安全。s[i] 複製到 s[i-p]。這是原地刪除的標準模式。'\0',否則 printf 可能讀取殘留垃圾字符。實際工程中直接用 strspn + memmove 或手寫 ltrim:
char *ltrim(char *s) {
while (isspace(*s)) s++;
memmove(s, s, strlen(s) + 1); // +1 複製結束符
return s;
}
ltrim 再 rtrim,或單遍歷雙指針完成。