刪除每個輸入行末尾的空格,製表符,並刪除全空格行

2022-07-02 05:24:08 字數 2571 閱讀 5908

源自《the c programming language》p22 pr1-18:

編寫乙個程式,刪除每個輸入行末尾的空格,製表符,並刪除完全是空格的行

**:main.c

1

#include

<

stdio.h

>23

#define

maxline 1045

intgetline(

char

s, int

lim);

6void

copy(

char

to,

char

from);

7int

calclen(

char

s);8

9int

main()

1029

if(index

>-1

)30copy(post_line[row

++], line);

//如果line是全空格字串,對其進行消除字串結尾處

31//

操作使得line成為乙個空字串,故不將其(空字串)

32//

拷貝到post_line中。33}

3435

for(index =0

; index

<

row;

++index)

//post_line針對其中每個字串的倒數第二個字元是否為'\n'

36//

在列印的時候做不同處理。

37if

(post_line[index][calclen(post_line[index])-1

] !='\n

')

38printf(

"%s\n

", post_line[index]);

39else

40printf("%s

",post_line[index]);

4142

return0;

43}4445

intgetline(

char

s, int

lim)

4657

s[i] ='

\0';58

fflush(stdin);

5960

return

i;61}62

63void

copy(

char

to,

char

from)

6474

75int

calclen(

char

s)76

分析:1,   針對輸入的字串(line)的倒數第二個字元是否為'/n',分情況進行消除字串末尾的空格及製表符處理。

2,   針對處理後的字串(post_line[n])的倒數第二個字元是否為'/n',在列印的時候分情況進行處理。

3,   getline函式:讀入一行字元後,將輸入緩衝區清空,這樣當超過字元陣列line的界限的字元會被清除掉,

如果不清空,則在下次呼叫getline函式時,上次超出的字元部分會被getchar函式直接

讀到這次的line字元陣列中,造成混亂。

main.c

1

#include

<

stdio.h

>23

#define

maxline 100045

intgetline(

char

line,

intmaxline);

6int

remove(

char

s);7

8int

main()919

20int

remove(

char

s)

//刪除字串s末尾的空格和製表符並返回它的新長度

2138

39return

i;40

}

分析:1,  對比於自己實現的**,發現這段**簡潔多了,思路也很清晰和易懂。

而上面那段**就不存在這個問題。

(b),參考**沒有考慮一行字串沒有'/n'的情況,這和它將maxline設成1000有關,

極端的情況是乙個字串就是1000個字元,並且倒數第二字元不是'/n',如果maxline

的值比較小的話,這個問題就凸現出來了,相比於此,上段**考慮了這種情況。

修改remove函式:

while(s[i] != '/n' && i < maxline - 2)

++i;

if(i != maxline - 2)

--i;

while(i >= 0 && (s[i] == ' ' || s[i] == '/t'))

--i;

if( i >= 0 && i < maxline - 2)

++i;

s[i] = '/n';

++i;

s[i] = '/0'; 

使用迴圈讀取輸入行,直到使用者輸入一行空

char s gets char st,int n 函式返回的是乙個指向char型別陣列開頭的指標。如果使用者輸入空行,陣列第乙個元素是 0 判定迴圈結束的條件就應該是 while s gets ch,size 0 char s gets char st,int n 讀取輸入行,最多不能超過n 1個...

C 去除輸入行中空白的方法

刪除每個輸入行末尾的空格及製表符,並刪除完全是空格的行 include 每一行存放不超過1000個字元,最多輸入不超過1000行 define max 1000 int getline char line,int limit www.cppcns.com main i printf the new ...

刪除單鏈表的給定節點(非末尾)

此刪除法,只給了需要刪除的那個節點!請編寫乙個函式,使其可以刪除某個鍊錶中給定的 非末尾 節點,你將只被給定要求被刪除的節點。示例 1 輸入 head 4,5,1,9 node 5 輸出 4,1,9 解釋 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 4 1 9.示例 ...