文字列

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

文字列

#1

投稿記事 by ふぐお » 18年前

#include<stdio.h>
#pragma warning(disable:4244)

unsigned long len(char *);
char *cat(char *,char *);
int main(void)
{
	unsigned long l;
	char c[256],a[256];
	gets(c);
	gets(a);
	cat(c,a);
	printf("%s",c);
	return 0;
}

unsigned long len(char *c)
{
	char *p;
	for(p=c;*p;p++);
	return (p-c);
}

char *cat(char *c,char *a)
{
	char *p=(c+len(c));
	while(*p++=*a++);
	return c;
}
をコンパイルすると
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
test.c:
警告 W8060 test.c 27: おそらく不正な代入(関数 cat )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
と言う警告が出ます
理由を教えてください

バグ

Re:文字列

#2

投稿記事 by バグ » 18年前

while(*p++=*a++);

これが原因です。条件ループをさせたいのならば、代入ではなく、判別式でなければいけません。

a = b
bの値をaに代入する。

a == b
aとbが等しい場合に真となる。

box

Re:文字列

#3

投稿記事 by box » 18年前

while(*p++=*a++);

は、次の書き方と等価です。

	while ((*p = *a) != '\0') {
		p++;
		a++;
	}

こちらの書き方では、
・*pに*aを代入し、結果を評価する。
・評価した結果(つまり*pの内容)が'\0'でない間、ループする。
ということを簡略化せずに書いています。
これを少しだけ簡略化すると

	while (*p = *a) {
		p++;
		a++;
	}

となります。この時点で、コンパイル時に同じ警告が出ます。
「while文の中が条件式でなくて代入式になっていますが、本当にいいですか?」
という意味です。

もっと簡略化すると、お書きになったとおりとなります。
というわけで、「今回の場合は」警告を無視してかまわないです。

ふぐお

Re:文字列

#4

投稿記事 by ふぐお » 18年前

とても分かりやすっかたです。ありがとうございました
これからもよろしくお願いします

閉鎖

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