web-dev-qa-db-ja.com

Cでの文字のカウント

文字列内のすべての文字をカウントするプログラムを作成しようとしています。もともと持っていたのですが、スペースが数えられないことに気づきました。なぜこれが機能しないのかわかりません。

for(m=0; z[m] != 0; m++) {
    if(z[m] != ' ') {
        charcount ++;
    }
}

どんな援助もありがたいです。

編集*入力(文字列)がこのようにスキャンされている場合、違いはありますか?そして、はい、すべてが初期化されます。 z [m]が評価するものも印刷してみましたが、これは「m」の文字列の実際の値ではありません。これが問題だと思います。

for(j=0; j<7; j++){
    printf("Enter a string:\n");
    scanf("%s", z);
        for(m=0; z[m] != 0; m++){
                if(z[m] != ' '){
                charcount ++;
                }
        }
6
James

charcountを初期化する必要があります。それ以外は、zがゼロで終了する文字の配列であり、mintまたは同様のものであれば、機能するはずです。私はおそらくz[m] のではなく z[m] != 0(!0 = trueおよび0 = falseであるため)が、両方とも機能します。それを行うにはもっと効率的な方法があります(最近はコンパイラーがこれをポインターベースのループに変換することを処理すると思いますが)。

最小限の編集で完全で正しい例を次に示します。

const char * z = "testing one two three";
int m;
int charcount;

charcount = 0;
for(m=0; z[m]; m++) {
    if(z[m] != ' ') {
        charcount ++;
    }
}

昔ながらのCnullで終了する配列ではなく、ある種のStringクラスを使用している場合は、そのクラスをループする方法を確認する必要があります。

上記のすべては、ASCII文字列を処理していることも前提としています。UTFエンコードされた文字列を処理している場合は、マルチバイト文字を処理する必要があります。


編集について:それは大きな違いを生みます:scanf will 最初の空白で停止します (私はそれを忘れていました)。ただし、zを正しく宣言していない場合は、それよりもさらに大きな違いが生じる可能性があります。 (文字列の読み取りにscanfを使用する場合[またはscanfを完全に回避する場合]にもフィールド幅を使用することをお勧めします。そうしないと、格納しようとする文字数を制御できません。したがって理論上、オーバーフローを回避するのに十分な大きさのバッファはありません。詳細はこちら: http://www.crasseux。 com/books/ctutorial/String-overflows-with-scanf.html

7
T.J. Crowder

strlen() を使用できます

whileループを使用し、より意味のある変数名を使用することをお勧めします

m = textIndex 
z = text

このようなものはうまくいくでしょう

while (text[textIndex] != 0x00)
{
  textIndex++;
}
4
Anonymous

Scanfを使用する代わりに、次のようなfgetを試してください。

char input[256];
fgets(input, sizeof(input), stdin);

fgetsはファイルから全体行を読み取ります。そのため、ファイルハンドルとしてstdinを渡すと、標準入力から読み取られ、ほとんどの場合、コンソールにバインドされます。ただし、注意すべき点の1つは、fgetsから取得する文字列に改行文字が含まれている可能性があることです。文字列の空白文字( '')との不等式を明示的にチェックするのではなく、ctype.hのisspace関数を使用することをお勧めします。この関数は、さまざまな形式の空白(通常のスペースと改行を含む)をチェックします。

完全で実行可能な例を次に示します。

#include <stdio.h>
#include <ctype.h>

int count_nonspace(const char* str)
{
 int count = 0;
 while(*str)
 {
  if(!isspace(*str++))
   count++;
 }
 return count;
}

int main()
{
 char input[256];
 fgets(input, sizeof(input), stdin);
 printf("%d\n", count_nonspace(input));
}
2

はい、scanfを使用した入力スキャンには違いがあります。

    scanf("%s", z);
...
                if(z[m] != ' '){

scanf( "%s" ...)は常にスペース文字で中断するため、trueの場合。 stdinから読み取るためにfgetsを使用する方が良いです。

#define MAXINPUT 80
char line[MAXINPUT];
for(j=0; j<7; j++) {
  printf("Enter a string:\n");
  if( fgets( line, 80, stdin ) )
  {
    char *c=line;
    if( strchr(line,'\n') ) *strchr(line,'\n')=0;
    while( *c )
    {
      if( *c!=' ' )
        ++charcount;
      ++c;
    }
  }
}

または、必要に応じて[〜#〜] white [〜#〜] -spaces then take

#include <ctype.h>
...
if( !isspace(*c) )
0
user411313