这是str_replace中的错误吗?

时间:2016-06-02 01:59:05

标签: c string

我搜索了一个字符串替换函数,发现了这个问题

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) {

看起来它可能是===的错误。这是一个错误还是我误解了?它应该是==吗?

3 个答案:

答案 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)附近使其成为完整表达式,并将完整表达式视为序列点。序列点是程序执行中的一个点,在进行下一步之前,所有副作用都会被评估。