程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Count blanks,tabs and newlines

Count blanks,tabs and newlines

編輯:關於C語言

by freeuniverser

程序語言現在是越來越多,但是好多都是在現有語言的基礎上改了改,本質上並沒有給程序員帶來什麼,這就提醒廣大程序員不要被某種語言限制住了,不要過分迷戀某種語言,因為現在還沒有完美語言(也許人類追求的完美本來就是個美麗的錯誤)。這個月的TIOBE上,C語言又回到了首位,但是也不必太在意,僅供參考嘛。

C語言的一些小程序舉例:

Count blanks,tabs and newlines


/*First Version*/
#include <stdio.h>
int main(void)
{
  int blanks;
  int tabs;
  int newlines;
  int c;
 
  blanks = 0;
  tabs = 0;
  newlines = 0;

  while((c = getchar()) != EOF)
  {
    if(c == ' ')
      blanks++;
    if(c == '\t')
      tabs++;
    if(c == '\n')
      newlines++;
  }
  printf("\nBlanks: %d\nTab: %d\nNewline: %d\n",
    blanks,tabs,newlines);
  return 0;
}寫程序時的注釋非常重要,以前初寫的時候亂寫,而且命名單字母一大堆,其實吧,好的命名與注釋同等重要,甚至見名知意比注釋更加有力。程序小的話還可以,但是涉及大點的項目的話,如果注釋和命名不注意,那麼很容易產生問題,後期的維護會異常困難,沒人願意再深究你的變量究竟代表什麼,甚至你自己都不知道當初的意思是什麼。


 1 /*Second Version*/
 2 #include <stdio.h>
 3
 4 int mian(void)
 5 {
 6   int blanks;
 7   int tabs;
 8   int newlines;
 9   int c;
10   int done;
11   int lastchar;
12
13   blanks = 0;
14   tabs = 0;
15   newlines = 0;
16   done = 0;
17   lastchar = 0;
18
19   while(done == 0)
20   {
21     c = getchat();
22     if(c == ' ')
23       blanks = blanks + 1;
24     if(c == '\t')
25       tabs = tabs + 1;
26     if(c == '\n')
27       newlines = newlines + 1;
28     if(c == EOF)
29     {
30       if(lastchar == '\n')
31       {
32         newlines = newlines + 1;
33       }
34       done = 1;
35     }
36     lastchar = c;
37   }
38   printf("\nBlanks: %d\nTabs: %d\nNewlines: %d\n",
39     blanks,tabs,newlines);
40   return 0;
41 }自加自減運算符看似方便,但是濫用其實很不好,容易繞進去。其實好多語言在設計上都是在玩兒技巧,這樣可以少敲點字,可以少占點內存,可以……現在內存不小了,多敲幾個字母也沒什麼,實際上是在節省時間,如果後期維護的話,那將會少很多力氣,這不挺好的嗎?

Copy input to output


 1 /*First Version*/
 2 #include <stdio.h>
 3 #define NONBLANK 'c'
 4 int main(void)
 5 {
 6    int c;
 7    int lastchar;
 8    lastchar = NONBLANK;
 9    
10    while((c == getchar()) != EOF)
11    {
12      if(c != ' ')
13        putchar(c);
14      if(c == ' ' && lastchar != ' ')
15        putchar(c);
16      lastchar = c;
17    }
18 }用getchar()和putchar()搭配干活不累,有好多這樣的函數可以拿來用,當然你也可以自己去寫自己的,不過他山之石何不用呢?如果不是特別需要的地方,那麼不妨就“拿來主義”下吧


 1 /******Second Version*********************/ 
 2   int c;
 3   int inspace;
 4   inspace = 0;
 5   while((c = getchar()) != EOF)
 6   {
 7     if(c == ' ')
 8     {
 9       if(inspace ==0)
10       {
11         inspace = 1;
12         putchar(c);
13       }
14     }
15     if(c != ' ')
16     {
17       inspace = 0;
18       putchar(c);
19     }
20   }Copy input to output,replace tab by \t,backspace by \b and backslash by \\

這個程序的\b是個問題,可能會有點錯誤,或者不是很理想,有興趣自己可以寫寫。


 1  //*****First Version*****************************/
 2  
 3   int c;
 4   while((c = getchar()) != EOF)
 5   {
 6     if(c == '\t')
 7       printf("\\t");
 8     if(c == '\b')
 9       printf("\\b");
10     if(c == '\\')
11       printf("\\\\");
12     if(c != '\t' &&c != '\b' && c != '\\')
13       putchar(c);
14       }簡單的用if判斷條件,雖然顯得有點單調,但是確實非常常用的。這很符合人的邏輯,如果怎麼……你看其實程序語言裡面用的單詞其實沒有太難的,對比好多語言你就會發現,像while,if,for等等,好多都是重復的,就行寫文章一樣,把不同的字做一個合乎邏輯的排列組合即可,程序也是如此,只不過是換種表達方式罷了。


 1 /******Second Version***************************/
 2   int c,t;
 3   while((c = getchar()) != EOF)
 4   {
 5     t = 0;
 6     if(c == '\\')
 7     {
 8       putchar('\\');
 9       putchar('\\');
10       t = 1;
11     }
12     if(c == '\t')
13     {
14       putchar('\\');
15       putchar('t');
16       t = 1;
17     }
18     if(c == '\b')
19     {
20       putchar('\\');
21       putchar('b');
22       t = 1;
23     }
24     if(t == 0)
25       putchar(c);
26   }putchar()雙劍合璧,顯得更清晰。這就像籬笆,你可以兩個捆一起,還可以三個、四個……最後連起來就可以了,分開寫可能有時候會顯得更加清晰、有條理,擠一塊當然也可以,注意分隔,沒人規定籬笆不能是一長條彎起來吧。


 1 /******Third Version***********************/
 2   #define DOUBLELINE '\\'
 3   int c;
 4   while((c = getchar()) != EOF)
 5   {
 6     switch(c)
 7     {
 8       case DOUBLELINE:
 9            putchar(DOUBLELINE);
10            putchar(DOUBLELINE);
11            break;
12       case '\t':
13            putchar(DOUBLELINE);
14            putchar('t');
15            break;
16       case '\b':
17            putchar(DOUBLELINE);
18            putchar('b');
19            break;
20       default:
21               putchar(c);
22               break;
23     }
24   }switch-case顯得更為清晰而有條理,但是好多時候不及if有效。其實,好多時候,一種語言提供了多種方式來表達同樣的意思,只不過要看場合和自己的興趣了,不要太拘束,怎樣順怎麼來表達,做到簡潔清晰就行了。

prints its input one word per line


 1   int c;
 2   int inspace;
 3   inspace = 0;
 4   while((c = getchar()) != EOF)
 5   {
 6     if(c == ' ' || c == '\t' || c == '\n')
 7     {
 8       if(inspace == 0)
 9       {
10         inspace = 1;
11         putchar('\n');
12       }
13     }
14     else
15     {
16       inspace = 0;
17       putchar(c);
18     }
19   }inspace在上面的作用已經很明顯,和上面的done一樣,作為控制作用,有點相當於開關。畢竟程序語言借自然的智慧誕生於人類的頭腦,其結果也必然是來源於現實社會,又反映現實社會。

好多語言發展到現在都遇到了瓶頸,而且好多都是在炒剩飯,然後換件外衣,新瓶裝老酒而已。其實也沒有哪種語言可以一統程序界江湖,不必有宗教情節,期待簡潔清晰方便的語言出現。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved