2016-06-02 2 views
0

나는 문자열 교체 기능을 검색하고, 작동하지만 경고 잘못보고 제공이 질문에str_replace의 버그입니까?

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

를이 ===의 버그 일 가능성이 있습니다. 버그입니까, 오해 했습니까? 대체로 ==일까요?

+2

아마도 버그가 아닙니다. 'strstr'가 0이 아닌 값을 반환하는 한 실행됩니다. –

+0

@EugeneSh. 승인. 하지만 어쨌든 경고를 처리해야합니다. –

+1

파일/프로젝트입니까? 그렇다면 처리하십시오. 그러나 이것은 스타일 경고의 일종입니다. –

답변

3

아니요. 이 경우 실제로는 tmp의 값이 조건으로 사용됩니다.

strstr의 반환 값 :

char * strstr(char * str1, const char * str2); 

str1str2에서 처음 나타나는 포인터를 돌려 str2 경우 널 포인터 str1의 일부가 아니다.


이 경고를 제거하려면 다음을 수행하십시오

for (count = 0; (tmp = strstr(ins, rep)) != NULL; ++count) { 
+1

'(tmp = strstr (ins, rep))'만으로도 경고가 제거됩니다. – zneak

2

이 아니, 버그 아니다. 루프의 몸에 따라 :

for (count = 0; tmp = strstr(ins, rep); ++count) { 
    ins = tmp + len_rep; 
} 

실제로 는 뭔가tmp를 사용합니다. for 문에서 연속 조건은 strstr()의 결과를 tmp에 할당 한 다음 0이 아닌 한 (즉, 문자열을 찾은 경우) 본문을 실행합니다. strstr()은 문자열을 찾을 수없는 경우에만 NULL을 반환하기 때문입니다.

나는이 그냥 gcc 일반적으로이 비교되는 경향이 당신이 실수보다는 == =을 사용했을 수 있습니다 그것은 for에 계속 조건 (중간 비트)를 실현하는 것을 과민하다 생각한다.

그 이유는 error: what the heck? :-)보다는 진단 상태가 warning: suggest ...인데, 경고를 없애기 위해서는 (그것이 나쁜 위치는 아니지만) 간단히 제안 된 것을 수행하고 전체 연속 조건을 괄호로 묶으십시오 .

+0

* yoda 조건 *을 사용하지 않는 것이 좋습니다. –

0

[ strstr reference ] 상태 char * strstr (char *str1,const char *str2)
대한 리턴 값은 다음

시퀀스는 본

STR2에 지정된 문자 시퀀스 전체, 또는 널 (null) 포인터 STR1에서 처음 발생에 대한 포인터가 아닌 경우 에서 str1.

지금 당신이 좀 더 C 용어에 대한 :

tmp = strstr(ins, rep) 

C의 주요 목적은 전체 표현식을 평가하는 것입니다 C는 여기 strstr(ins, rep)의 반환 값으로 평가한다. 부작용은이 반환 값을 tmp에 할당하는 것입니다. 오류 :

suggest parentheses around assignment used as truth value 

gcc가 당신이 부주의 한 실수를 방지하는 데 도움이 방법이다, 내가 믿는 대신 a==ba=b를 입력 말한다. 첫 번째 경우에는 b의 값이 진리 값으로 사용되지만 두 번째 경우에는 is a equal b의 결과가 진리 값으로 사용됩니다. ()tmp = strstr(ins, rep) 주위에두면 컴파일러가 표현의 값을 진리 값으로 평가할 수있는 녹색 신호를 제공합니다.

사이드 참고 :

tmp = strstr(ins, rep)가 전체 표현하게 주위 () 퍼팅, 전체 표현은 일련의 점으로 간주됩니다. 시퀀스 포인트는 다음 단계로 진행하기 전에 모든 부작용이 평가되는 프로그램 실행의 한 지점입니다.