ここから本文です

char型配列の終端文字について

ber********さん

2013/3/502:42:12

char型配列の終端文字について

以下のプログラムを実行すると、
「ファイル「C:/Users/ksato/AppData/Local/EasyIDEC/project/stringcontrol/main.c」の
「9行目」で記述エラーを発見しました。
警告
assignment makes pointer from integer without a cast」
という警告が出てきます。
char型配列に文字列を入れて、終端までループする処理なのですが、

#include <stdio.h>
#include <string.h>

int main(void)
{
int i = 0;

char str[] = "あいうえおかきくけこ=さしすせそ/";
while(strcmp(str[i], "\0") != 0){
printf("%c\n",str[i]);
i++;
}

return 0;
}

文字列の終端をstrcmp()で比較しているのですが、”\0”でも0x00でもNULLでも
同様のエラーになります。何か根本的な間違いをしているのでしょうか

閲覧数:
491
回答数:
4
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

qui********さん

2013/3/511:19:38

2つの点で根本的に間違っています。

一つ。コンパイル/リンク時に出るエラー・警告はデータの内容・値には関係ありません。文法・記法として間違っているか間違いの可能性がある場合に起こります。今回は「文字列の終端」なんてのはコンパイラの知ったことではありません。

二つ。エラーメッセージを読んでいないこと。エラーメッセージは、コンパイラが(あるいはシステムが)問題点をレボートしているものです。その内容を読まずに自分の思い込みでプログラムをいじっても解決は遠いです。
今回は、型変換(キャスト)なしに整数値をポインタとして引数に与えているよ、ということだそうです。実際には、strcmpの第一引数のstr[i]が間違いなのですが。

なお、今回のようなケースでは、「文字列の比較」は使わずに一文字だけを終端かどうか検査するように
while(str[i] !='\0'){
とでもするのが一般的かと思います。

質問した人からのコメント

2013/3/11 01:58:36

strcmp()を文字列ではなく、文字の比較に使っていたことがまずおかしいですね。
そもそもwhile文の括弧の中をループ条件にしていませんでした。エラーのメッセージもちゃんと読んでいませんでした。ありがとうございました。

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

bt_********さん

編集あり2013/3/817:51:36

こんにちは~
出先なのでパッと見で回答してますがエラーとか出ちゃったらご容赦を・・・

■間違っている点
・xianren428さんがおっしゃっている通り、strcmpを使うなら引数は &str[i] の様にアドレスを渡さないとダメです。もっと言うとstrcmpは第二引数もconst char *型なので"\0"のままでOK。'\0'と言う書き方はアドレスではなく文字そのものを指すので実行時に異常終了するので注意です。

・charの配列に全角文字(ワイドバイト)文字を使用しているので、printfのとこで%cでは表示できない。%cは1バイトだけ表示するので文字化けっぽく表示されると思います。ループで一文字ずつ表示したいのであれば putchar(str[i]); を使ってみては如何でしょう?この際改行が無いので printf("\n"); もセットで書いてあげると良いかと。

spa********さん

2013/3/509:11:45

while(strcmp(str[i], "\0") != 0){
この行を
while(strcmp(str[i], '\0') != 0){
にしてはどうでしょうか。
つまり、文字列はダブルクォーテーションで囲みますが、
単一の文字はシングルクォーテーションで囲む。と言うことです。

xia********さん

2013/3/503:17:51

char 型配列の要素は char 型です。
strcmp の一つ目の引数は char * 型です。
strcmp を使いたいなら一つ目の引数は &str[i]。
ただ、普通は strcmp を使わず while(str[i] != '\0')。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる