C/C++實現(xiàn)去除字符串中的空格(附帶源碼)
一、項目背景詳細介紹
在實際開發(fā)的過程中,字符串處理是 C 語言程序員最常接觸的任務之一。從用戶輸入到文本處理,從網(wǎng)絡協(xié)議解析到日志分析,都離不開字符串的讀取、修改與轉(zhuǎn)換。特別是其中一個極為常見的需求:去除字符串中的空格(Remove Spaces)。
去除空格看似簡單,但它實際包含多種情況:
- 去除所有空格
- 去除首尾空格
- 去除多余空格(多個空格合并為一個)
- 保留中間空格,只刪除無效的前后空格
- 處理普通空格
' '、制表符\t、換行符\n等
不同任務對空格的處理方式不同。例如:
- 命令解析器(Command Parser) 要求嚴格去除全部空白符;
- 輸入框處理程序 要處理用戶輸入時的多余空格;
- Excel/CSV 文件導入 需要刪除每行兩端的空格;
- Web 服務器 在解析 HTTP header 時需處理空格問題。
因此學習如何在 C 語言中有效處理字符串空格,對于從事系統(tǒng)開發(fā)、應用開發(fā)和算法開發(fā)的人員非常重要。
本項目將圍繞“去除字符串空格”主題,采用一步步教學方式,從需求分析、技術原理到完整代碼實現(xiàn),再到深度解讀,最后給出常見問題、擴展方向和性能優(yōu)化方案,打造一篇可以直接發(fā)布到博客或課堂教學的完整文章。
二、項目需求詳細介紹
本項目要求實現(xiàn)一個 C 語言程序,能夠根據(jù)用戶輸入去除字符串中的空格。具體要求如下:
1. 輸入
- 一個包含空格的字符串
- 字符串可使用
fgets或自定義讀取方式輸入 - 支持普通空格
' '、制表符\t(可選擴展)
2. 輸出
刪除所有空格后的新字符串
3. 功能細化
程序需實現(xiàn)以下功能:
功能一:刪除所有空格
例如:
輸入 "a b c d" → 輸出 "abcd"
功能二:支持原地刪除(in-place)
不能額外創(chuàng)建大塊新空間,必須在源字符串上操作。
功能三:提供函數(shù)封裝
如:
void removeSpaces(char *str);
功能四:健壯性
包括:
- 空字符串處理
- 全空格字符串處理
- 邊界測試(如長度 1 的字符串)
功能五:注釋豐富,便于教學
三、相關技術詳細介紹
本項目涉及以下 C 語言技術知識點:
1. 字符數(shù)組與字符串基礎
在 C 語言中:
- 字符串由
char[]數(shù)組表示 - 必須以
'\0'結(jié)尾 - 空格字符
' '的 ASCII 值為 32
2. 雙指針 / 快慢指針技術
刪除空格是典型的 原地字符串處理 問題,核心是雙指針:
fast:掃描原始字符串slow:構建新字符串
流程:
fast 從頭開始掃描 遇到非空格 → 寫入 slow 遇到空格 → fast 跳過 slow 始終 <= fast
處理結(jié)束后:
slow 位置寫 '\0'
示例:
輸入字符串:a _ b _ _ c (_ 表示空格)
fast 指針移動過程:
fast=0 → a(寫) → slow=1 fast=1 → _ 跳過 fast=2 → b(寫) → slow=2 fast=3 → _ 跳過 fast=4 → _ 跳過 fast=5 → c(寫) → slow=3
結(jié)果字符串變?yōu)椋?code>abc\0___
slow 指針寫入結(jié)束字符,這樣不會產(chǎn)生內(nèi)存泄漏或臟讀問題。
3. 字符判斷技術
判斷空白字符可以采用:
僅判斷 ' ' 空格:
if (str[fast] != ' ')
使用 ctype.h 支持更多空白符:
if (!isspace(str[fast]))
isspace 包含:
| 字符 | 說明 |
|---|---|
| ' ' | 普通空格 |
| \t | tab |
| \n | 換行 |
| \r | 回車 |
| \v | 垂直制表符 |
| \f | 換頁符 |
本項目默認使用第一種(僅刪空格),擴展部分演示使用 isspace()。
4. 輸入字符串技術
推薦用安全的 fgets 讀取字符串:
fgets(str, sizeof(str), stdin);
fgets 自動處理空格并保留換行符。
四、實現(xiàn)思路詳細介紹
完整的思路分為以下幾步:
用戶輸入一個字符串
使用 fgets 讀取一行,支持空格。
調(diào)用 removeSpaces 函數(shù)處理字符串
使用雙指針原地刪除空格。
打印輸出結(jié)果
輸出刪除空格后的新字符串。
關鍵邏輯:雙指針刪除空格
- fast 指針掃描每個字符
- 遇到空格則跳過
- 遇到非空格則寫入 slow 指針位置
- slow 指針前進
- 最后 slow 寫入 '\0'
復雜度
- 時間復雜度:O(n)
- 空間復雜度:O(1)(原地處理)
非常高效。
五、完整實現(xiàn)代碼
/***************************************************************
* C語言實現(xiàn):刪除字符串中的空格(教學版)
* 說明:
* 1. 使用雙指針(快慢指針)原地刪除空格
* 2. 支持所有普通 ASCII 空格
* 3. 代碼注釋全面,可用于博客/課堂教學
***************************************************************/
#include <stdio.h>
#include <string.h>
/***************************************************************
* 函數(shù)名稱:removeSpaces
* 功能描述:刪除字符串中的所有空格(in-place 原地操作)
* 參數(shù):
* char *str —— 需要處理的字符串
* 返回值:
* 無(直接修改原字符串)
***************************************************************/
void removeSpaces(char *str) {
// 判空保護
if (str == NULL) return;
int slow = 0; // 慢指針:構建新字符串
int fast = 0; // 快指針:掃描原字符串
while (str[fast] != '\0') {
// 如果 fast 指向的不是空格,則寫入 slow 位置
if (str[fast] != ' ') {
str[slow] = str[fast];
slow++; // 慢指針前進
}
fast++; // 快指針前進
}
// 最后寫入字符串結(jié)束符
str[slow] = '\0';
}
/***************************************************************
* 主函數(shù):演示刪除空格功能
***************************************************************/
int main() {
char str[200];
printf("請輸入一個包含空格的字符串:\n");
fgets(str, sizeof(str), stdin);
// 由于 fgets 會讀取換行符,通常需要去掉
str[strcspn(str, "\n")] = '\0';
printf("\n原字符串:\"%s\"\n", str);
removeSpaces(str);
printf("刪除空格后:\"%s\"\n", str);
return 0;
}
六、代碼詳細解讀
1. removeSpaces
作用:
- 使用雙指針原地刪除字符串內(nèi)所有空格字符
' ' - fast 掃描原字符串
- slow 構建不含空格的新字符串
特點:
- 原地處理,不占額外空間
- O(n) 復雜度
- 不改變非空格字符相對位置
2. main 函數(shù)
作用:
- 接收用戶輸入(包含空格)
- 調(diào)用 removeSpaces 進行空格清理
- 打印處理結(jié)果
七、項目詳細總結(jié)
本項目從實際應用需求出發(fā),通過 C 語言實現(xiàn)了字符串空格刪除功能。項目的主要亮點包括:
1.雙指針實現(xiàn),效率高:原地刪除,時間和空間復雜度極優(yōu)。
2.結(jié)構清晰,適合教學:清晰展示了 fast/slow 指針如何協(xié)作。
3.輸入處理全面:使用 fgets 支持空格輸入,并處理換行符。
4.健壯性良好
支持空字符串、全空格字符串等多種邊界情況。
該程序適合作為:
- C 語言課堂案例
- 博客深入教學文章
- 字符串算法基礎講解
- 實戰(zhàn)項目中輸入清理工具函數(shù)
八、項目常見問題及解答
1. 為什么不用額外數(shù)組存儲結(jié)果?
因為要求 原地處理(in-place),避免內(nèi)存浪費,提高效率。
2. 如果字符串非常長怎么辦?
雙指針算法是 O(n) 時間、O(1) 空間,非常適合超長字符串。
3. 為什么需要 slow 指針?不能直接刪除嗎?
直接刪除會造成字符整體移動,導致 O(n²) 時間復雜度。
雙指針不會反復移動字符,因此更快。
4. 能否刪除所有空白字符?
可以,只需把條件換成:
if (!isspace(str[fast]))
5. fgets 為什么要去掉換行符?
因為 fgets 會把用戶按下回車產(chǎn)生的 \n 讀進字符串,導致輸出中意外出現(xiàn)換行符。
九、擴展方向與性能優(yōu)化
1. 刪除所有空白字符
使用 isspace(),支持:
- 空格
- Tab
- 換行
- 回車
等所有空白字符。
2. 刪除首尾空格(類似 trim())
使用兩個指針掃描左右兩端空格區(qū)域,提高文本處理能力。
3. 合并連續(xù)空格為一個
例如:a b c → a b c
可用于搜索框、文本規(guī)范化。
4. 使用 SIMD 技術提速(多字符并行處理)
對于超大文本,可以使用 SSE/AVX 指令加速空格檢測。
5. 處理 UTF-8 空格字符
包括全角空格 \xE3\x80\x80,對于處理中文文本很有用。
到此這篇關于C/C++實現(xiàn)去除字符串中的空格(附帶源碼)的文章就介紹到這了,更多相關C++去除字符串空格內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++實現(xiàn)圖的遍歷算法(DFS,BFS)的示例代碼
本文給大家?guī)淼氖菆D遍歷的算法,DFS(深度優(yōu)先遍歷),BFS(廣度優(yōu)先遍歷)。這兩個算法是比較重要和常用的算法,但是在圖中的實現(xiàn)只是最基本的操作,快跟隨小編一起學習一下吧2022-07-07
C語言中getchar()與putchar()函數(shù)詳解
本文主要介紹了C語言中getchar()與putchar()函數(shù)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01

