首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言刪除字符串前導空格:scanf 格式錯誤與移位邏輯修正

     編輯:程式設計疑難解答

實現去除字符串前導空格時,常見三個錯誤: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 更安全。
  • 雙指針/雙索引法:p 指向第一個非空格,i 從 p 掃描到結束,將 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,或單遍歷雙指針完成。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved