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

