2017-02-14 6 views
1

私はC言語を初めて使っています。空白、タブ、改行を数えるためのプログラムを実装する上で間違っていることを特定するのに助けてくれる人がいますか?ブランク、タブ、改行を数えます。

コード:

#include <stdio.h> 
//Write a program to count blanks, tabs, and newlines. 
int main(){ 
    char str[100]; 
    printf("Enter the text"); 
    scanf("%s",&str); 
    int space=0; 
    int tabs=0; 
    int newLine=0; 
    int i=0; 
    while(str[i]!='\0'){ 
     if (str[i] == ' ') 
      space++; 
     if (str[i] == '\t') 
      tabs++; 
     if (str[i] == '\n') 
      newLine++; 
     i++; 

    } 

    printf("space:%d\ntabs:%d\nnew line:%d",space,tabs,newLine); 
    return 0; 
} 
+0

私はファイルの代わりにコンソールから入力を取得したいのですが? @xing –

+0

getchar()を使用できますか?はいの場合は、どうですか?なぜなら、私はそれを試してみましたが、正しい出力を与えていないからです。 –

+0

助けてくれてありがとうございました。 –

答えて

0

を見ることができます。 Cはすべての文字がasciiであるとみなし、それはCに関する限りです。したがって、スペースを空白と比較するのではなく、0x20(アスキースペース文字の16進数)と比較してください。同様に他の比較のためにしてください、それは良い良いビットでなければなりません。

比較結果について、端末に印刷ステートメントを入れることを心配しないでください。例えば、チェックされている文字とチェックされている文字とその結果を印刷します。これは実際にここで何が起こっているのかをデバッグするのに役立ちます。終了したら、それらの印刷ステートメントを削除することを忘れないでください。

PSここはアスキーテーブルへのリンクです。 http://www.asciitable.com

+0

私はそれを比較するのは良い考えではないと思いますこの場合、例えばEBCDIC表が使用されているシステムではプログラムを使用することができないからです。 –

+0

大抵私は同意しますが、CはISO標準です。つまり、Cを使用している場合はasciiを使用します。アスキーが制限されているのでバリエーションがありますが、それは実際のCとはちょうどCのようなものではありません。これで私の解決策はもっと適切になりません....それは移植性が低く悪いベストプラクティスになります。 –

+0

なぜCがISO標準を確認すると、標準Cが実装されているすべてのシステムがASCIIテーブルを使用していると思いますか?例えば、IBMメインフレームはEBCDICテーブルを使用します。 –

0

それはあなたのプログラムで使用されているようscanf機能は安全ではありませんし、空白をカウントすることはできません。


注意。

scanf("%s",str); 
      ^^^ 

そして、C標準関数mainに応じて、パラメータを指定せずに書くことはなく、

scanf("%s",&str); 
      ^^^ 

が、それは正しいだろう考慮に入れる

int main(void) 

のように宣言されなければなりません機能を使う方が良いです。fgetc

この

Hi, Marco Roberts 
Welcome to SO 

のようなテキストを入力する場合は、プログラムの出力は

space: 4 
tabs: 0 
new line: 2 

使用はCtrl + zまたはCtrlキー+ Dを(応じて次のようになります

#include <stdio.h> 

int main(void) 
{ 
    unsigned int space = 0; 
    unsigned int tabs = 0; 
    unsigned int newLine = 0; 

    printf("Enter the text: "); 

    int c; 

    while ((c = fgetc(stdin)) != EOF) 
    { 
     switch (c) 
     { 
     case ' ': 
      ++space; 
      break; 

     case '\t': 
      ++tabs; 
      break; 

     case '\n': 
      ++newLine; 
      break; 
     } 
    } 

    printf("\nspace: %u\ntabs: %u\nnew line: %u\n", space, tabs, newLine); 

    return 0; 
} 

たとえば、使用しているシステムで)入力を中断します。

別のアプローチは、これをチェックするより良い方法は、ASCII値を比較することで、次のよう

#include <stdio.h> 

#define N 100 

int main(void) 
{ 
    unsigned int space = 0; 
    unsigned int tabs = 0; 
    unsigned int newLine = 0; 

    printf("Enter the text: "); 

    char str[N]; 

    while (fgets(str, sizeof(str), stdin)) 
    { 
     for (const char *p = str; *p; ++p) 
     { 
      switch (*p) 
      { 
      case ' ': 
       ++space; 
       break; 

      case '\t': 
       ++tabs; 
       break; 

      case '\n': 
       ++newLine; 
       break; 
      } 
     }   
    } 

    printf("\nspace: %u\ntabs: %u\nnew line: %u\n", space, tabs, newLine); 

    return 0; 
} 
0

あなたが(コメントで@xingが言ったように)コンソール入力を行いたい場合は、fgetsの代わりscanfを使用する必要があります。だから私たちは持っているでしょう:

#define SIZE_MAX 255 

int main() { 
    char str[SIZE_MAX]; 
    int i; 
    int space; 
    int tabs; 

    printf("Enter the text : "); 
    fgets(str, SIZE_MAX, stdin); //stdin if it is a console input 
    // Careful, if the input length is shorter than the SIZE_MAX (here 255), 
    // Then a '\n' will be added at the end of your string. To counter it : 
    if(strchr(str, '\n') != 0) { //checks if there is a '\n' 
     str[strlen(str)-1] = '\0'; //changes it to a '\0' (end of string) 
    } 

    //For the verifications, you can do that : 
    for(i=0 ; i < strlen(str) ; i++) { 
     if (str[i] == ' ') { 
      space++; 
     } 
     if (str[i] == '\t') { 
      tabs++; 
     } 
    } 
    printf("\nspace : %d\ntabs: %d\n", space, tabs); 

    //NB : There will be no newLine because it is a console input. 
    return 0; 
} 
+0

@nsonoreこの場合、改行文字をどのように数えるのですか?:) –

+0

まあ、カウントする新しい行はありません。ユーザーがEnterを押すと、入力が検証されます。私が知る限り、コンソール入力を使用しているときは '\ n'を追加できません。 しかし、それが読みたいファイルであれば、うまくfgetsは次の改行まで読み込まれるので、カウンタを作成するだけです。 – Insonore

関連する問題