我搜索了一个字符串替换函数,发现了这个问题
What is the function to replace string in C?
如果我使用答案中的代码,它会起作用但看起来不对并发出警告:
/home/dac/osh/util.c: In function ‘str_replace’:
/home/dac/osh/util.c:867:5: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
for (count = 0; tmp = strstr(ins, rep); ++count) {
看起来它可能是=
和==
的错误。这是一个错误还是我误解了?它应该是==
吗?
答案 0 :(得分:3)
不,不是。在这种情况下,tmp
的值实际上是用作条件。
strstr
的返回值:
char * strstr(char * str1, const char * str2 );
返回指向
str2
中第一次出现str1
的指针,如果str2
不属于str1
,则返回空指针。
要删除警告,请尝试以下操作:
for (count = 0; (tmp = strstr(ins, rep)) != NULL; ++count) {
答案 1 :(得分:2)
不,这不是错误。根据循环体:
for (count = 0; tmp = strstr(ins, rep); ++count) {
ins = tmp + len_rep;
}
实际上使用 tmp
来表达某些东西。 for
语句中的延续条件会将strstr()
的结果赋给tmp
,然后只要它为非零(即,只要它找到字符串)就执行该主体。这是因为strstr()
仅在无法找到字符串时返回NULL
。
我怀疑这只是gcc
偏执,因为它意识到for
语句上的延续条件(中间位)通常往往是比较而你可能意外地使用了=
而不是==
。
这就是为什么诊断状态warning: suggest ...
而不是error: what the heck?
:-)如果你想要摆脱警告(这不是一个不好的立场),只需按照它的建议和用括号括起整个延续条件。
答案 2 :(得分:0)
[ strstr reference ]表示char * strstr (char *str1,const char *str2 )
的返回值为:
指向整个序列的str1中第一次出现的指针 str2中指定的字符,如果序列不是,则返回空指针 出现在str1。
现在再做一点C术语,当你这样做时:
tmp = strstr(ins, rep)
C的主要意图是将表达式作为一个整体进行评估,C在此处将其评估为strstr(ins, rep)
的返回值。副作用是将此返回值分配给tmp
。错误:
suggest parentheses around assignment used as truth value
是gcc帮助您避免粗心错误的一种方式,我敢说,输入a=b
代替a==b
。注意,在第一种情况下,b的值用作真值,但在第二种情况下,is a equal b
的结果用作真值。通过在()
周围放置tmp = strstr(ins, rep)
,您可以为编译器提供绿色信号,以将表达式的值计算为真值。
旁注:
将()
置于tmp = strstr(ins, rep)
附近使其成为完整表达式,并将完整表达式视为序列点。序列点是程序执行中的一个点,在进行下一步之前,所有副作用都会被评估。