文字列が空であるかどうかの判定がうまくできません。
Posted: 2011年6月04日(土) 16:17
はじめまして。
私は去年1年授業でC言語を習った大学生です。
これは今宿題で作っている「n人の持っているゲームを管理するプログラム」の一部です。
名前を入力してもらって、リストにその名前がなければ新規登録して、名前があればその番号を示すような部分を作ろうと思っています。
↓自分で作ってみたプログラム(一部抜粋) *繰り返して使うことを全く意識していません。 よって、当然プログラムを終えてまた起動すると、結局毎回同じ動作をすることになります。
これを実行すると、名前を入れた後なかなか次(↑の通りだと終了)へ行きません。
そこで、16/17/19/20にブレイクポイントを設置し、デバッグをかけてみました。
すると、名前を入力した後普通に16で止まるのですが、その後17を飛ばして19の次の20へ行ってしまいます。
当然その下のwhileの部分も、ずっと判定内のため無限ループになってしまいます。
自動変数をみてみると、list[0]やlistは0x006c1290"ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ・・・・"と文字化けしたときようなものが入っています。
特になにか代入したわけではないのであのようなものが入っているのはわかるのですが、だからでしょうか?
16でリストの1番目(配列で言うと0番目)になにも入っていなければ―が、思ったように判断されません。
私はなにも入っていないを「""」で表しているのですが、本当はどのようにあらわすのがよいでしょうか?
使用環境
OS:Windows7 Home Premium
ソフト:Microsoft Visual Studio 2008 ツール:C/C++コンパイラツール
私は去年1年授業でC言語を習った大学生です。
これは今宿題で作っている「n人の持っているゲームを管理するプログラム」の一部です。
名前を入力してもらって、リストにその名前がなければ新規登録して、名前があればその番号を示すような部分を作ろうと思っています。
↓自分で作ってみたプログラム(一部抜粋) *繰り返して使うことを全く意識していません。 よって、当然プログラムを終えてまた起動すると、結局毎回同じ動作をすることになります。
int main(void){
int i,k=-1,n=100; //iは、配列を作成したりリストの番号を調べるための変数。 kは、同じ名前があるかどうか判定したりするための変数。 nはn人のn。
char **list,people[20];
list=(char **)malloc(n*sizeof(char *));
list[0]=(char *)malloc(n*20*sizeof(char));
for(i=0;i<n;i++){
list[i]=list[0]+i*20;
}
//配列のサイズがnの値によって変わるため、メモリを動的に確保した。
i=0;
printf("あなたの名前は?\n");
scanf("%s",people); //ここで聞いた名前をリストに登録したい。
if(strcmp(list[0],"")==0){ //1番目が空きなら、そこに新規登録する。
strcpy(list[0],people);
}
else{ //そうじゃなかったら同じ名前が登録されているか探しに行く。
while(strcmp(list[i],"")!=0){ //登録されているデータがある間
if(strcmp(list[i],people)==0){ //同じ名前があればその番号を記録する。
k=i;
break; //もう探す必要はないので抜ける。
}
}
if(k==-1){ //登録されているデータの中になければ、
strcpy(list[i],people); //最後に新規登録する。
}
}
free(list); //メモリの開放。
return 0;
}
そこで、16/17/19/20にブレイクポイントを設置し、デバッグをかけてみました。
すると、名前を入力した後普通に16で止まるのですが、その後17を飛ばして19の次の20へ行ってしまいます。
当然その下のwhileの部分も、ずっと判定内のため無限ループになってしまいます。
自動変数をみてみると、list[0]やlistは0x006c1290"ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ・・・・"と文字化けしたときようなものが入っています。
特になにか代入したわけではないのであのようなものが入っているのはわかるのですが、だからでしょうか?
16でリストの1番目(配列で言うと0番目)になにも入っていなければ―が、思ったように判断されません。
私はなにも入っていないを「""」で表しているのですが、本当はどのようにあらわすのがよいでしょうか?
使用環境
OS:Windows7 Home Premium
ソフト:Microsoft Visual Studio 2008 ツール:C/C++コンパイラツール