ページ 11

文字列と配列、whileの文で困ってると思います。

Posted: 2012年6月04日(月) 10:23
by mokopoko
はじめまして。
何冊か本(特に独習C)を読みながら打ちはじめて一週間の初心者です。
半角スペースを含む文字列(英単語)を、半角スペースごとに区切り、配列の要素にして並べて表示するというプログラムを書いています。
が、エラーがたくさん出ております。一番気になっているのはwhileです。

whileの使い方がわかってないと思います。
while文には、
半角スペースでなければ、配列の要素として代入している。
というつもりにしたいのです。

どなたか助けていただけないでしょうか?よろしくお願いします。

コード:

#include <stdio.h>

int main (int argc, const char * argv[])
{
    int i;
    char str[0][30], str2[20][30];
    char *d;
    gets(str);
    i = 0;
    d = str;
    for (; str[0][i]; i++) {
        printf("%c", str[0][i]);
        *d = str[0][i];
        printf("%c", *d);
        while (*d != ' ') str2[i][30] = *d; //◆ここ 修正 by softya(ソフト屋)
        printf("%c \n", str2[20][30]);
        *d++;
    }
    int Num =  sizeof d /sizeof d[0];
    for (int h = 0; h <= Num; h++) {
        printf("%c \n", str2[h][30]);
    }
    return 0;
}


Re: 文字列と配列、whileの文で困ってると思います。

Posted: 2012年6月04日(月) 10:58
by softya(ソフト屋)
強調表示はコード内など使えない場合がありますのでプレビューで必ず確認してくださいね。今回は修正しておきました。
それとプログラム自体に色々問題があるのは分かりますがエラーコードを貼って頂けますか?

Re: 文字列と配列、whileの文で困ってると思います。

Posted: 2012年6月04日(月) 11:55
by mokopoko
ご返信、修正有り難うございます。よろしくお願いします。

①Xcodeでやっていて、常時、黄色くなってる箇所は次の通りです。
get(str);//incompatible pointer types passing 'char[0][30]'to parameter of type 'char *'
d = str;//incompatible pointer types assigning to 'char*' from 'char[0][30]'
while (*d != ' ')//Expression result unusedまたは//array index of '30' indexes past the end of an array (that contains 30 elements
printf("%c \n", str2[20][30]);//array index of '30' indexes past the end of an array (that contains 30 elements
printf("%c \n", str2[20][30];//array index of '30' indexes past the end of an array (that contains 30 elements)

②出力結果はなにもでてきません。 
whileのところに矢印がでてきます。

Re: 文字列と配列、whileの文で困ってると思います。

Posted: 2012年6月04日(月) 12:10
by softya(ソフト屋)
まず、配列についてですがchar str[0][30]と宣言は出来ません。char str[0]は要素数が0個なので利用上大問題です。
[補足] 正確に書くと定義はできますが事実上使えないです。
それとget(str);とd = str;は型としてchar *strかchar str[30];じゃないとダメです。char str[0][30]は型が違うのでNGです。
やりたいことからするとchar str[30];じゃないかと思います。
while (*d != ' ')に関しても後ろの文の問題でエラーです。
あと他のエラーですが、配列はchar str[30];とか書いたら添字は0から29の範囲ですので、str2[20][30]は明らかに間違いです。あと固定値で意味が無いのも問題です。

全体的に文字列、配列、ポインタの理解不足が原因ですので、全部いっぺんに扱うような事は避けて文字列と配列だけで片付くように最初は組んでみると良いと思います。
それと間違えやすいので次のように書くことをおすすめします。

コード:

while (*d != ' ') str2[i][30] = *d;
 ↓
while (*d != ' ') {
	str2[i][30] = *d;
}