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

