c 语言练习__去掉多余的空白字符_修正
生活随笔
收集整理的這篇文章主要介紹了
c 语言练习__去掉多余的空白字符_修正
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include <stdio.h>
#include <string.h>
#include <errno.h>#define BUF_SIZE 128
/** 要求:處理一個字符串,刪除字符串中多余的空格、'\t'和空行,并滿足下列要求:* (1)對原字符串只能進行一次掃描。* (2)不允許申請新的空間。(這個有點疑問,聲明變量也會申請空間的。)* (3)處理后的字符串的首尾不能有空格、'\t'和空行。* (4)如果原字符串中連續出現空格和'\t',則處理后的字符串只需存儲一個空格。* (5)如果原字符串中連續出現空格、'\t'和空行,則處理后的字符串只需存儲一個空行* (對這個空行理解也不清楚是一個\n,還是兩個\n?,字符串后兩個\n才會出一* 個可見的空行,這個地方可能是 \n 我以為)。* * 這個題花了我兩個小時,寫了三遍。* 總結: 1.對問題的理解很重要.* 2.把問題轉換成合理的模型,可以減少許多工作.* 3.每個局部都正確,不代表整體有意義.** 這個題的處理模型就是字符串拷貝。* 但有條件.就是上面說的,轉換成程序是這樣的。。。。看代碼吧,* 寫的注釋都多余.* * 關于 bug 為何不直接修正,因為我看人家都只給的函數。*//** FIXME: 如果修正bug 的話,這里將會修改成* -----------* char remove_extra_space(char *str, int is_trim_header)* -----------*/
void remove_extra_space(char *str)
{char *s = str; //代表生成的字符串,因為 s 多表示臨時字符串。char *prv = NULL; //代表上一個有效的字符.這個有效的是指...(你應該明白的)for(; prv==NULL ||*prv != '\0'; ++str){ //這個的好處在于 不會遺忘掉 ++str.而且 continue 后還能執行. switch (*str){case '\t': *str = ' '; //方便統一處理.因為結果都是空格case ' ' :/** FIXME: 如果修正bug 的話,這里將會修改成* -----------* if ( (prv == NULL && is_trim_header != 0) || *prv == '\n' || *prv ==' '){* -----------*/if (prv == NULL || *prv == '\n' || *prv ==' '){continue;}break;case '\0': case '\n': if (prv == NULL){/** FIXME: 如果修正bug 的話,這里將會修改成* -----------* if (*str == '\n' && is_trim_header != 0) * -----------*/if (*str == '\n') continue;}else if ( *prv == ' ' || *prv == '\n'){*prv = *str; /** FIXME:這個地方獲取返回值,返回值初始值 '\0' */ continue;}break;}if (s != str){*s = *str;}prv = s;++s;}
/** FIXME: 返回返回值.*/}int main(int argc,char *argv[]){char read_buf[BUF_SIZE] = {'\0'};int read_size = 0;errno = 0;while ((read_size = fread(read_buf, sizeof (char), BUF_SIZE-1, stdin)) >0){read_buf[read_size] = '\0';/* * FIXME:注意這個地方有 bug, 讀取文件被分成 BUF_SIZE 的小塊,* 如果剛好在有空格(或 '\t' )處分割,則會缺少個空格.* 如果在換行前分割,會丟失換行.* 解決放案是傳入個 int is_trim_header (是否消除字符串開始處的空白或換行);* 如果 is_trim_header 不為 0 則 不保留開始處的空格,* 為 0 則 按照空格是出現在句子中間或末尾的情況處理.* * 這里要判斷行上次行末,和這次行首是否有空白符用來確定 is_trim_header 的值.* 這里還需要 remove_extra_space 返回讀到 \0 時刪掉的字符,才能確定如何補償* 空格還是回車** * if (上行刪掉的是\n && 本行有內容) 補償 \n,is_trim_header = 1;* else if (上行刪掉的是' ' && 本行有內容) is_trim_header = 0;* else is_trim_header = 1;*/remove_extra_space(read_buf);printf("%s",read_buf);}if (errno != 0){printf(strerror(errno));}return 0; }
?
轉載于:https://www.cnblogs.com/playerc/p/3217355.html
總結
以上是生活随笔為你收集整理的c 语言练习__去掉多余的空白字符_修正的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Configuring Locales
- 下一篇: 删除U盘作为启动盘的隐藏启动分区