質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

781閲覧

出力時の文字化けを改善したいです。

mudannkesseki

総合スコア16

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/07/18 01:05

編集2019/07/18 06:35

英文を入力し、英単語の出現頻度を求めるプログラムで、出力が文字化けしてしまいます。
END」を検出したらプログラムを終了し、例えば「This is a pen. This is a book.」という英文を入力したら、

This 2

is 2
a 2
pen. 1
book. 1

と表示されるようにしたいです。 
同じ単語であっても大文字と小文字の判定はしていないので違う単語と識別します。ピリオドがついている単語は違う単語と識別します。

元のプログラム↓

C言語

1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4 5 int strcmp(const char *s1,const char *s2); 6 struct node{ 7 char word[50]; 8 int kaisu; 9 char tango; 10 struct node *left; 11 struct node *right; 12}; 13 14 char wd[50]; 15 16 char *GetWord() 17 { 18 char a; 19 int len; 20 21 a=getchar(); 22 while(a==' ' || a=='\n') a=getchar(); 23 len=0; 24 while(a!=' ' && a!='\n'){ 25 wd[len++]=a; 26 a=getchar(); 27 } 28 wd[len]='\0'; 29 return &wd[0]; 30 } 31 32struct node *insert(struct node *x,int a) 33{ 34 if(x==NULL){ 35 x=(struct node *)malloc(sizeof(struct node)); 36 x->tango=a; 37 x->kaisu=1; 38 x->left=NULL; 39 x->right=NULL; 40 }else if(a== x->tango) 41 x->kaisu++; 42 else if(a< x->tango) 43 x->left=insert(x->left,a); 44 else 45 x->right=insert(x->right,a); 46 return x; 47 } 48 49void treeprint(struct node *x) 50{ 51 if(x!=NULL){ 52 treeprint(x->left); 53 printf("%5c %5c\n",x->tango,x->kaisu); 54 treeprint(x->right); 55 } 56} 57 58 int main(void) 59 { 60 struct node *root; 61 char *w; 62 63 root=NULL; 64 w=GetWord(); 65 while(strcmp(w,"***END***")!=0){ 66 root=insert(root,w); 67 w=GetWord(); 68 } 69 treeprint(root); 70 return 0; 71} 72

エラーコード

simple-getword.c: In function ‘main’:

simple-getword.c:66:24: warning: passing argument 2 of ‘insert’ makes integer from pointer without a cast [-Wint-conversion]
root=insert(root,w);
^
simple-getword.c:32:14: note: expected ‘int’ but argument is of type ‘char *’
struct node *insert(struct node *x,int a)

出力結果

This is a pen. This is a book.

END
� 
� 
� 
� 
� 
� 
� 
� 

修正したプログラム↓

C言語

1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4 5 int strcmp(const char *s1,const char *s2); 6 struct node{ 7 char word[50]; 8 int kaisu; 9 struct node *left; 10 struct node *right; 11}; 12 13 char wd[50]; 14 15 char *GetWord() 16 { 17 char a; 18 int len; 19 20 a=getchar(); 21 while(a==' ' || a=='\n') a=getchar(); 22 len=0; 23 while(a!=' ' && a!='\n'){ 24 wd[len++]=a; 25 a=getchar(); 26 } 27 wd[len]='\0'; 28 return &wd[0]; 29 } 30 31struct node *insert(struct node *x,char a) 32{ 33 if(x==NULL){ 34 x=(struct node *)malloc(sizeof(struct node)); 35 x->word=a; 36 x->kaisu=1; 37 x->left=NULL; 38 x->right=NULL; 39 }else if(strcmp(a,x->word)==0) 40 x->kaisu++; 41 else if(strcmp(a,x->word)<0) 42 x->left=insert(x->left,a); 43 else 44 x->right=insert(x->right,a); 45 return x; 46 } 47 48void treeprint(struct node *x) 49{ 50 if(x!=NULL){ 51 treeprint(x->left); 52 printf("%s %d\n",x->word,x->kaisu); 53 treeprint(x->right); 54 } 55 } 56 57 int main(void) 58 { 59 struct node *root; 60 char *w; 61 62 root=NULL; 63 w=GetWord(); 64 while(strcmp(w,"***END***")!=0){ 65 root=insert(root,w); 66 w=GetWord(); 67 } 68 treeprint(root); 69 return 0; 70}

エラーコード

getword2.c: In function ‘insert’:

getword2.c:35:12: error: assignment to expression with array type
x->word=a;
^
getword2.c:39:19: warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast [-Wint-conversion]
}else if(strcmp(a,x->word)==0)
^
In file included from getword2.c:3:0:
/usr/include/string.h:140:12: note: expected ‘const char *’ but argument is of type ‘char’
extern int strcmp (const char *__s1, const char *__s2)
^
getword2.c:41:19: warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast [-Wint-conversion]
else if(strcmp(a,x->word)<0)
^
In file included from getword2.c:3:0:
/usr/include/string.h:140:12: note: expected ‘const char *’ but argument is of type ‘char’
extern int strcmp (const char *__s1, const char *__s2)
^
getword2.c: In function ‘main’:
getword2.c:65:24: warning: passing argument 2 of ‘insert’ makes integer from pointer without a cast [-Wint-conversion]
root=insert(root,w);
^
getword2.c:31:14: note: expected ‘char’ but argument is of type ‘char *’
struct node *insert(struct node *x,char a)

warningとnoteの改善策もよければ教えていただきたいです

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/07/18 01:09

コードが途中で途切れているようです(警告の出ている「root=insert(root,w);」の箇所も見当たらなないです)。
mudannkesseki

2019/07/18 01:13

ご指摘ありがとうございます。修正いたしました。
SHOMI

2019/07/18 11:02

warningやnoteの理由はすべてメッセージに出力されていますが、あなたなりに調べたり考えたりしてみて何がわからなかったのでしょうか。
mudannkesseki

2019/07/19 02:28

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

回答4

0

自己解決

コメントにしている行が不必要、aに*をつけるなどして解決しました。

#include<stdio.h> #include<stdlib.h> #include<string.h> //int strcmp(const char *s1,const char *s2); struct node{ char word[50]; int kaisu; struct node *left; struct node *right; }; char wd[50]; char *GetWord() { char a; int len; a=getchar(); while(a==' ' || a=='\n') a=getchar(); len=0; while(a!=' ' && a!='\n'){ wd[len++]=a; a=getchar(); } wd[len]='\0'; return &wd[0]; } struct node *insert(struct node *x,char *a) { if(x==NULL){ x=(struct node *)malloc(sizeof(struct node)); strcpy(x->word,a); //x->word=a; x->kaisu=1; x->left=NULL; x->right=NULL; }else if(strcmp(a,x->word)==0) x->kaisu++; 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); } } int main(void) { struct node *root; char *w; root=NULL; w=GetWord(); while(strcmp(w,"***END***")!=0){ root=insert(root,w); w=GetWord(); } treeprint(root); return 0; }

投稿2019/07/19 02:24

mudannkesseki

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C

1struct node *insert(struct node *x, int a)

第二引数はchar*では?

C

1x->tango = a;

charに文字列は格納できません。
文字列の格納先はx->wordでは?

C

1}else if(a== x->tango) 2else if (a == x->tango) 3else if (a< x->tango)

C言語は==で文字列比較はできません。strcmp()を使用してください。
比較したいのもx->wordでは?

C

1printf("%5c %5c\n",x->tango,x->kaisu);

でやりたいのは以下では?

C

1printf("%s %d\n",x->word,x->kaisu);

(追記)

C

1struct node *insert(struct node *x,char a)

char*になっていませんが…

C

1x->word=a;

文字列のコピーはstrcpy()です。

投稿2019/07/18 01:25

編集2019/07/18 11:11
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mudannkesseki

2019/07/18 06:37

ご丁寧にありがとうございます。回答を元にプログラムを編集いたしました。
guest

0

原因としては、警告にある通り、引数の型が合っていないためです。
具体的にはコードが書いてないのでアドバイス不能です。

投稿2019/07/18 01:17

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/07/18 01:18

あと、これは「文字化け」じゃなくて、文字じゃないものを出力しているのが現状。
mudannkesseki

2019/07/18 06:37

ありがとうございます。回答を元に編集いたしました。
guest

0

エラーメッセージに提示されているコードは見当たりませんが。

そのコードでそのエラーが出たんでしょうか


root=insert(root,w);

insert関数の第二引数は、定義ではint となってますが、char* を渡しています
これをどうにかしましょう

#ところが、 x->tango=a; tango はchar ですね

投稿2019/07/18 01:13

編集2019/07/18 01:19
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mudannkesseki

2019/07/18 06:37

ありがとうございます。回答を元に編集いたしました。
y_waiwai

2019/07/18 09:12

修正後でも話になってません。 C言語の基礎からやり直そうレベルです おそらく何かの課題か宿題かでしょうけど、先生やら教授に聞いてみればどうでしょう
mudannkesseki

2019/07/19 02:27

解決しました。ありがとうございました。 プログラミングやりたくてやってるわけじゃないので。
y_waiwai

2019/07/19 04:06

まあ、ガッコの授業ならやらない訳にはいかないと思いますが、自分でやらないと身につきませんぜw #で、同様なもう一つの質問がありますが、同級生でしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問