ページ 1 / 1
文字列
Posted: 2007年3月06日(火) 01:28
by ふぐお
#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:文字列
Posted: 2007年3月06日(火) 08:07
by バグ
while(*p++=*a++);
これが原因です。条件ループをさせたいのならば、代入ではなく、判別式でなければいけません。
a = b
bの値をaに代入する。
a == b
aとbが等しい場合に真となる。
Re:文字列
Posted: 2007年3月06日(火) 09:42
by box
while(*p++=*a++);
は、次の書き方と等価です。
while ((*p = *a) != '\0') {
p++;
a++;
}
こちらの書き方では、
・*pに*aを代入し、結果を評価する。
・評価した結果(つまり*pの内容)が'\0'でない間、ループする。
ということを簡略化せずに書いています。
これを少しだけ簡略化すると
while (*p = *a) {
p++;
a++;
}
となります。この時点で、コンパイル時に同じ警告が出ます。
「while文の中が条件式でなくて代入式になっていますが、本当にいいですか?」
という意味です。
もっと簡略化すると、お書きになったとおりとなります。
というわけで、「今回の場合は」警告を無視してかまわないです。
Re:文字列
Posted: 2007年3月06日(火) 23:04
by ふぐお
とても分かりやすっかたです。ありがとうございました
これからもよろしくお願いします