web-dev-qa-db-ja.com

文字列内の単語を数える-cプログラミング

文字列内の単語をカウントする関数を作成する必要があります。この割り当ての目的のために、「単語」は、空白によって他の単語から分離された、非ヌル、非空白文字のシーケンスとして定義されます。

これは私がこれまでに持っているものです:

int words(const char sentence[ ]);

int i, length=0, count=0, last=0;
length= strlen(sentence);

for (i=0, i<length, i++)
 if (sentence[i] != ' ')
     if (last=0)
        count++;
     else
        last=1;
 else
     last=0;

return count;

プログラム全体が終了するまでテストできず、機能するかどうかわからないため、機能するかどうかわかりません。この関数を作成するためのより良い方法はありますか?

7
PhillToronto

あなたが必要だった

int words(const char sentence[])
{
}

(中括弧に注意してください)。

Forループは; の代わりに ,


免責事項なしで、これが私が書いたものです:

ライブで見るhttp://ideone.com/uNgPL

#include <string.h>
#include <stdio.h>

int words(const char sentence[ ])
{
    int counted = 0; // result

    // state:
    const char* it = sentence;
    int inword = 0;

    do switch(*it) {
        case '\0': 
        case ' ': case '\t': case '\n': case '\r': // TODO others?
            if (inword) { inword = 0; counted++; }
            break;
        default: inword = 1;
    } while(*it++);

    return counted;
}

int main(int argc, const char *argv[])
{
    printf("%d\n", words(""));
    printf("%d\n", words("\t"));
    printf("%d\n", words("   a      castle     "));
    printf("%d\n", words("my world is a castle"));
}
6
sehe

次の例を参照してください。次のアプローチに従うことができます:単語間の空白を数えます。

int words(const char *sentence)
{
    int count=0,i,len;
    char lastC;
    len=strlen(sentence);
    if(len > 0)
    {
        lastC = sentence[0];
    }
    for(i=0; i<=len; i++)
    {
        if((sentence[i]==' ' || sentence[i]=='\0') && lastC != ' ')
        {
            count++;
        }
        lastC = sentence[i];
    }
    return count;
}

テストする :

int main() 
{ 
    char str[30] = "a posse ad esse";
    printf("Words = %i\n", words(str));
}

出力:

Words = 4
4
aleroot
#include <ctype.h> // isspace()

int
nwords(const char *s) {
  if (!s) return -1;

  int n = 0;
  int inword = 0;
  for ( ; *s; ++s) {
    if (!isspace(*s)) {
      if (inword == 0) { // begin Word
        inword = 1;
        ++n;
      }
    }
    else if (inword) { // end Word
      inword = 0;
    }
  }
  return n;
}
2
jfs
bool isWhiteSpace( char c )
{
    if( c == ' ' || c == '\t' || c == '\n' )
        return true;
    return false;
}

int wordCount( char *string )
{
    char *s = string;
    bool inWord = false;
    int i = 0;

    while( *s )
    {
        if( isWhiteSpace(*s))
        {
            inWord = false;
            while( isWhiteSpace(*s) )
                s++;
        }
        else
        {
            if( !inWord )
            {
                inWord = true;
                i++;
            }
            s++;
        }
    }

    return i;
}
1
Andrew Bryant
#include<stdio.h>
#include<string.h>

int getN(char *);


int main(){
    char str[999];
    printf("Enter Sentence: "); gets(str);
    printf("there are %d words", getN(str));
}


int getN(char *str){
    int i = 0, len, count= 0;
    len = strlen(str);
    if(str[i] >= 'A' && str[i] <= 'z')
       count ++;


    for (i = 1; i<len; i++)
        if((str[i]==' ' || str[i]=='\t' || str[i]=='\n')&& str[i+1] >= 'A' && str[i+1] <= 'z')
        count++;


return count;
}
0
sheehab
#include <stdio.h>

int wordcount (char *string){

    int n = 0; 

    char *p = string ;
    int flag = 0 ;

    while(isspace(*p)) p++;


    while(*p){
        if(!isspace(*p)){
            if(flag == 0){
                flag = 1 ;
                n++;
            }
        }
        else flag = 0;
        p++;
    }

    return n ;
}


int main(int argc, char **argv){

    printf("%d\n" , wordcount("    hello  world\nNo matter how many newline and spaces"));
    return 1 ;
}
0
Tite

受講しているCクラスの関数を終了した後、投稿された質問を見つけました。私は人々が上に投稿したコードからいくつかの良いアイデアを見ました。これが私が答えのために思いついたものです。それは確かに他のものほど簡潔ではありませんが、それは機能します。多分これは将来誰かを助けるでしょう。

私の関数は文字の配列を受け取ります。次に、配列へのポインターを設定して、関数がスケールアップされた場合に関数を高速化します。次に、ループする文字列の長さを見つけました。次に、文字列の長さを「for」ループの最大値として使用します。次に、array [0]を参照しているポインターをチェックして、それが有効な文字または句読点であるかどうかを確認します。ポインタが有効な場合は、次の配列インデックスにインクリメントします。最初の2つのテストが失敗すると、ワードカウンターが増加します。次に、関数は、次の有効な文字が見つかるまで、任意の数のスペースでインクリメントします。 null '\ 0'または改行 '\ n'文字が見つかると、関数は終了します。関数は、nullまたは改行の前にあるWordを考慮して、終了する直前に最後にもう一度カウントをインクリメントします。関数は、呼び出し元の関数にカウントを返します。

#include <ctype.h>

char wordCount(char array[]) {
    char *pointer;    //Declare pointer type char
    pointer = &array[0];  //Pointer to array

    int count; //Holder for Word count
    count = 0; //Initialize to 0.

    long len;  //Holder for length of passed sentence
    len = strlen(array);  //Set len to length of string

    for (int i = 0; i < len; i++){

        //Is char punctuation?
        if (ispunct(*(pointer)) == 1) {
            pointer += 1;
            continue;
        }
        //Is the char a valid character?
        if (isalpha(*(pointer)) == 1) {
            pointer += 1;
            continue;
        }
        //Not a valid char.  Increment counter.
        count++;

        //Look out for those empty spaces. Don't count previous
        //Word until hitting the end of the spaces.
        if (*(pointer) == ' ') {
            do {
                pointer += 1;
            } while (*(pointer) == ' ');
        }

        //Important, check for end of the string
        //or newline characters.
        if (*pointer == '\0' || *pointer == '\n') {
            count++;
            return(count);
        }
    }
    //Redundent return statement.
    count++;
    return(count);
}
0
pete

別の解決策は次のとおりです。

#include <string.h>

int words(const char *s)
{
    const char *sep = " \t\n\r\v\f";
    int Word = 0;
    size_t len;

    s += strspn(s, sep);

    while ((len = strcspn(s, sep)) > 0) {
        ++Word;
        s += len;
        s += strspn(s, sep);
    }
    return Word;
}
0
William Morris

私はこれを課題として持っていました...だから私はこれがうまくいくことを知っています。この関数は、単語数、平均単語長、行数、文字数を提供します。単語を数えるには、isspace()を使用して空白をチェックする必要があります。 isspaceが0の場合、空白を読んでいないことがわかります。 wordCounterは、連続する文字を追跡するための単なる方法です。空白になったら、そのカウンターをリセットし、wordCountをインクリメントします。以下の私のコード:

Isspace(c)を使用して

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

int main() {
  int lineCount = 0;
  double wordCount = 0;
  double avgWordLength = 0;
  int numLines = 0;
  int wordCounter = 0;
  double nonSpaceChars = 0;
  int numChars = 0;
  printf("Please enter text.  Use an empty line to stop.\n"); 
  while (1) {
      int ic = getchar();
      if (ic < 0)    //EOF encountered
          break;
      char c = (char) ic;
      if (isspace(c) == 0 ){
      wordCounter++;
      nonSpaceChars++;
    }
      if (isspace(c) && wordCounter > 0){
      wordCount++;
      wordCounter =0;
    }
      if (c == '\n' && lineCount == 0) //Empty line
      { 
          break; 
      }
      numChars ++;
      if (c == '\n') {
          numLines ++;
          lineCount = 0;
      }
      else{
          lineCount ++;
    }
  }
  avgWordLength = nonSpaceChars/wordCount;
  printf("%f\n", nonSpaceChars);
  printf("Your text has %d characters and %d lines.\nYour text has %f words, with an average length of %3.2f ", numChars, numLines, wordCount, avgWordLength);
}
0
Peter Song
#include<stdio.h>

int main()   
{    
char str[50];    
int i, count=1;  
printf("Enter a string:\n");    
gets(str);    
for (i=0; str[i]!='\0'; i++)   
        {
        if(str[i]==' ')    
                {
                count++;
                }
        }
printf("%i\n",count);    
}
0
Touseef Hashmi