どうして出力結果がおかしくなるのか教えてください。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ジーラ(初心者)

どうして出力結果がおかしくなるのか教えてください。

#1

投稿記事 by ジーラ(初心者) » 4年前

英文を入力すると出てきた単語とその出現回数を表示するプログラムを、二分探索木を使って作っているのですが、どうも上手くいきません。
出力結果がどうしてこうなるのか、どこを直せばいいのか分かりません。
以前Linux環境でやったときは上手くいってたのですが……。データを移すのにドライブを経由したのが悪かったのでしょうか?
今やっているOSはWindows。コンパイラーはgccです。

コード:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node{
   char word[20];
   int kaisu;
   struct node *right;
   struct node *left;
};

 char tango[20];

struct node *insert(struct node *x,char *a)
{
   if(x == NULL){
      x=(struct node *)malloc(sizeof(struct node));
      strcpy(x->word,a);
      x->kaisu = 1;
      x->left = NULL;
      x->right = NULL;
   }
    else if(strcmp(a,x->word)==0)
     x->kaisu += 1;
    else if(strcmp(a,x->word)<0)
     x->left =insert(x->left,a);
    else
     x->right =insert(x->right,a);
    return x;
}

void treeprint(struct node *x)
{
   if(x!=NULL){
      treeprint(x->left);
      printf("%s[%d]\n",x->word,x->kaisu);
      treeprint(x->right);
   }
}

char *GetWord(){
    char a;
    int len;

    a=getchar();
    while(a==' ' || a=='\n' || a=='.' || a=='.' || a=='\'' || a==','){
        a=getchar();
        len=0;
    }
    while(a!=' ' && a!='\n' && a!='.' && a!='.' && a!=','){
        tango[len++]=a;
        a=getchar();
    }
    tango[len]='\0';
    return &tango[0];
}

int main(void)
{
   struct node *root;
   char *g;

   root=NULL;
   g=GetWord();
   while(strcmp(g,"***END***")!=0){
     root=insert(root,g);
     g=GetWord();
   }
   treeprint(root);
   return 0;
}
入力した英文は

コード:

This is a test file.

This file has two sentences.

***END***
そして結果が

コード:

[5]
This[1]
Thisfile[1]
Thisfilehas[1]
Thisfilehastwo[1]
Thisfilehastwosenten[1]
となってしまいます。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: どうして出力結果がおかしくなるのか教えてください。

#2

投稿記事 by みけCAT » 4年前

GetWord関数内において、
入力によっては未初期化の自動変数lenの値が計算に使用されてしまい、未定義動作となります。
例えば、入力の最初の文字が空白などでなかったり、
入力の途中で空白などが2個以上連続せず1個だけ現れた時に、未定義動作となります。
入力にかかわらずlenを初期化してから処理をするようにするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ジーラ(初心者)

Re: どうして出力結果がおかしくなるのか教えてください。

#3

投稿記事 by ジーラ(初心者) » 4年前

言われた通り、GetWord関数内でlenを最初に宣言した時に初期化するように変えたら上手くいきました!
以前上手くいってたのは、入力した英文の頭に空白があったからのようです。

ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る