C言語に関する質問
初めて質問させて頂きます。C言語初心者です。
実は講義で「ファイル中の英文を単語に分けてその出現頻度をカウントするコードを木構造を用いて出力せよ」という課題が出ました。
そこで、参考にするコードを検索しましたところ、以下のURLにあるベストアンサーのコードが近いと感じました。
http://okwave.jp/qa/q4155655.html
コードの内容は以下の通りになります。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef struct node Node;
struct node{
char *word;
int count;
Node *left,*right;
};
Node *root=NULL;
void compose(FILE *fp);
void inorder(Node *p);
void strlower(char *s);
int main(int argc, char *argv[]) {
FILE *fp;
Node *new;
fp=fopen(argv[1],"r");
if(fp==NULL){puts("ファイルを開けません");return(-1);}
compose(fp);
inorder(root);
return (0);
}
void strlower(char *s){
while(*s!=NULL){*s=tolower(*s);s++;}
}
void compose(FILE*fp){
Node **p,*new;
char buf[256];
while(1){
fscanf(fp,"%[^a-zA-Z0-9]",buf);
if(fscanf(fp,"%[a-zA-Z0-9]",buf)==EOF)break;
strlower(buf);
if(root==NULL){
new=(Node *)malloc(sizeof(Node));
new->left=NULL; new->right=NULL; new->word=strdup(buf); new->count=1;
root=new;
}else{
*p=root;
while(1){
if(strcmp(buf,(*p)->word)==0){
(*p)->count++;break;
}else if(strcmp(buf,(*p)->word)<0){
if((*p)->left==NULL){
new=(Node *)malloc(sizeof(Node));
new->left=NULL;new->right=NULL;new->word=strdup(buf);new->count=1;
(*p)->left=new;
break;
}else{
*p=(*p)->left;
}
}else{
if((*p)->right==NULL){
new=(Node *)malloc(sizeof(Node));
new->left=NULL; new->right=NULL; new->word=strdup(buf); new->count=1;
(*p)->right=new;
break;
}else{
*p=(*p)->right;
}
}
}
}
}
}
void inorder(Node*p){
if (p==NULL) return;
inorder(p->left);
printf("%s %d\n",p->word, p->count);
inorder(p->right);
}
しかし、これをそのままコンパイル・実行すると、コンパイル時に以下の注意が出ます。
warning
comparison between pointer and integer ('int' and 'char *')
while(*s!=NULL){*s=tolower(*s);s++;}
上記の注意を無視してそのまま実行すると、segmatation faultが出てしまいますorz
おそらく、sの型が*s=s[]なので、注意の中の「s++」の部分で誤作動を起こしている(s++を実行するにはsはint型でなければならない)と思うのですが、どうコード文を変えれば良いのかがよくわかりません。
どなたかお教え頂けると幸いです。どうぞよろしくお願いしますm(_ _)m
お礼
早速の回答ありがとうございます。 >2.の2行目を使う案件は有得ると思います。 とのことですが、具体的にどういうときに使い分けるものなのでしょうか? 質問に質問を重ねてすいませんが宜しくお願いします