文字列を格納する

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

文字列を格納する

#1

投稿記事 by » 16年前

こんにちは、いつもお世話になっています。
C言語は初心者でテキストを見ながら進めています。
WindowsのVistaを使っています。

今回は文字列の配列を2つ用意して、一方は入力用で、もう一方は入力した文字列と一致しなかったら、格納するプログラムを作ろうとしたのですが、エラー:左辺値が必要(st2 = st1;)とありました。どうしたらよいでしょうか?
#include <stdio.h>
#include <string.h>

int main(void)
{
	char st1[100];
	char st2[50][100];
	int i, cnt = 0;
	
	printf("文字列を入力してください:");	
	while ( scanf( "%s", st1 ) != EOF ) {

		for ( i = 0; i < cnt; i++ ) {
			if ( strcmp( st1, st2 ) == 0 ) {
				printf("その文字列はすでに格納されています。\n");
				break;
			}
		}

		if ( i == cnt ) {
			printf("その文字列はまだ格納されていません。\n");
			st2 = st1;
			cnt++;
		}
		printf("文字列を入力してください:");
	}

	for ( i = 0; i < cnt; i++ ){
		printf( "\n[%d] : %s", i + 1, st2 );
	}

	return 0;
}

box

Re:文字列を格納する

#2

投稿記事 by box » 16年前

strcpy() を使ってください。

Re:文字列を格納する

#3

投稿記事 by » 16年前

回答ありがとうございました。
st2 = st1;をstrcpy(st2,st1)と変更しました。
それぞれa,b,cと入力し実行したら、
[1]:a
[2]:b
[3]:c
となったのですが、into the wildと入力し実行を行ったところ、
その文字列はまだ格納されていません。
文字列を入力してください:その文字列はまだ格納されていません。
文字列を入力してください:その文字列はまだ格納されていません。
[1]:into
[2]:the
[3]wild
と表示されました。
これは、どうしてこのような結果になるのでしょうか?
また、どうしてst2=st1は左辺値が必要となるのでしょうか?

box

Re:文字列を格納する

#4

投稿記事 by box » 16年前

> これは、どうしてこのような結果になるのでしょうか?

scanf() の仕様です。
空白またはそれに類する文字を入力した時点で、
第2引数に指定した領域(st1)への格納は打ち止めとなります。
into the wild<Enter>
と入力した場合、途中の空白(2個)と最後のEnterで
データを区切ります。

"into the wild"
という、途中に空白を含むデータがほしい場合は、
fgets() など別の関数を使う必要があります。

> また、どうしてst2=st1は左辺値が必要となるのでしょうか?

st2[50][100]
という、いわゆる2次元配列を定義した時点で、
st2[0]~st2[49]
の50個のポインタ値は決まってしまい、別の値に変更することはできません。
st2
という、動かせない値(左辺に置けない値)に対して何かを代入しようとしたため、
「左辺値が必要」というコンパイルエラーが出ます。

Re:文字列を格納する

#5

投稿記事 by » 16年前

回答ありがとうございます。
scanf()は空白を含む文字列は読み込めないのですね。

while ( gets( st1 ) == NULL )としたら、空白文字も読み込むことができました。

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

閉鎖

“C言語何でも質問掲示板” へ戻る