2

私はcプログラミング言語の初心者であり、charsの操作に関連する大学のチュートリアル課題があります(この課題では採点されません)。単語を数える必要があります。回答をまとめてオンラインWebに送信する必要があります。私のコードが私には見えないテストケースに対して実行される環境。これが私の割り当てです。

次のようにフォーマットされた文字列を返す関数'wc'を記述します: "NUMLINES NUMWORDSNUMCHARSNUMBYTES"。空白文字は、空白、タブ(\ t)、および新しい行(\ n)です。文字とは、空白以外のものです。指定された文字列はnull文字(\ 0)で終了します。

これが私のコードです:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* wc(char* data) {
  char* result ;
  int numLine ;
  int numWords ;
  int numChars ;
  int i;
  int numBytes =strlen(data);
  char* empty=NULL;
  while(strstr(data,empty)>0){
    numWords=1;

    for (i = 0; i < sizeof(data); i++) {

    if(data[i]=='\n'){
     numLine++;
   }
    if(data[i]==' ' ){
     numWords++;
   }
    if(data[i]!=' '){
     numChars++;
   }
   }

   }

    sprintf(result, "%d %d %d %d", numLine, numWords, numChars, numBytes);
    return result;
}

このコードは私に正しい出力結果を与えるでしょう、しかし私はここで何かが欠けています、少なくともテストは私にそれを教えてくれます。

4

5 に答える 5

5

非常に重大なエラーが発生しました。

  char* result;
  ...
  sprintf(result, "%d %d %d %d", numLine, numWords, numChars, numBytes);

これはCでは許可されていません。最初に文字列に十分なメモリを割り当てる必要があります。result十分な大きさの静的配列として宣言するmallocか、コースでそれをカバーした場合は使用します。

例えば

char buf[100];  // temporary buffer

sprintf(buf, "%d %d %d %d", numLine, numWords, numChars, numBytes);

char *result = malloc(strlen(buf) + 1);   // just enough for the string
strcpy(result, buf);                      // store the string

return result;
于 2013-03-19T17:53:23.607 に答える
2

この入力がある場合はどうなりますか?

Two        Words.

スペースを数えるだけでなく、空白/非空白の間の遷移を数える必要があります。


また、私はかなりstrstr(data,NULL)何も役に立たないと確信しています。

于 2013-03-19T17:49:20.500 に答える
1

1) sizeofが間違っています:

演算子の代わりに、次のようにforループsizeofを使用する必要があります。strlen()

for (i = 0; i < strlen(data); i++)
                ^ not sizeof

sizeof(data)であるデータポインタアドレスのサイズのみを返します4data[]必要なすべての文字を読み取るため、の長さ(またはの文字数) strlen()が返されますdata[]data[]

2)メモリエラー:

次のエラーに割り当てられたメモリがないことに気付くことができますresult。それは次のように宣言します:

char* result ;

とメモリ割り当てなし!そしてあなたはあなたのコードの未定義の振る舞いsprintfを引き起こすそれを使って書いています

3)while(strstr(data、empty)> 0)が間違っている

strstr()空の文字列に対する文字列の検索位置はNULL、チェック: char * strstr(const char * s1、const char * s2);

strstr()は常に戻りますdata、なぜこれを呼び出しているのですか?このループは必要ないと思います。while()

私はあなたのコードを以下のようにある程度まで改善しました、私が上で述べたように3つのエラーだけが修正されました(読んだコメントを理解するために)、あなたの基本的なアルゴリズムは正しいです:

#define SIZE 256   // added size macro
char* wc(char* data)  
  char* result = malloc(SIZE*sizeof(char)); //(2) allocated memory for result 
  int numLine ;
  int numWords ;
  int numChars ;
  int i;
  int numBytes =strlen(data);
    numWords=1; 
                    // (3) remove while loop
    for (i = 0; i < strlen(data); i++) {  //(1) change size
        if(data[i]=='\n'){
         numLine++;
     }
        if(data[i]==' ' ){
         numWords++;
     }
        if(data[i]!=' '){
         numChars++;
     }
    }
    sprintf(result, "%d %d %d %d", numLine, numWords, numChars, numBytes);
    return result;
 }

int main(){
    printf("\nresult: %s\n", wc("q toei lxlckmc    \t \n ldklkjjls \n i \t nn "));
    return 1;
}

出力:

result: 2 14 28 41
于 2013-03-19T17:49:19.473 に答える
1

また、空白チェッカーのforタブが欠落しているように見え\t、単語の内外を正しくチェックしていません。これには、 stdbool.hboolで定義されているブール型を使用できます。

于 2013-03-19T17:54:27.087 に答える
1

wc unixコマンドのソースコード:

http://www.gnu.org/software/cflow/manual/html_node/Source-of-wc-command.html

処理されたすべてのテストケース。

于 2013-03-19T17:57:46.493 に答える