2011-03-13 3 views
0

문자열의 첫 번째 줄의 문자 수를 계산하는 함수를 만듭니다. 문자열이 한 줄로 길다면 null을 종료 할 때까지 문자 수를 계산합니다. ch 문자를 \ n과 비교하는 부분이 예상대로 작동하지만 ch 문자를 \ 0과 비교할 수 없습니다. 문자열에 여러 개의 \ 0을 추가하더라도 비교를 결코 충족시키지 못합니다. 어떤 생각?C : 문자열의 문자와 ' 0'의 비교가 작동하지 않습니까?

#include <stdio.h> 

int main() { 
    /*variables*/ 
    char* string="shit\nand\npee\0"; 
    int bytesRead=0; 
    int bytesTemp=0; 
    char ch=' '; 

    /*find the number of characters before a newline or end of string*/ 
    while(ch!='\n') { //doesn't work with ch!='\0' 
     sscanf(string+bytesRead, "%c%n", &ch, &bytesTemp); 
     bytesRead+=bytesTemp; 
     printf("Bytes read: %d\n", bytesRead); 
     printf("Variable ch has value: %c\n", ch); 
    } 
    return 0; 
} 
+4

시도한 '\ 0'과 (과) 비교 한 부분은 어디입니까? – jonsca

+0

잠시 후 코멘트에 있습니다. 정확히 작동하지 않는 것이 무엇인지 명확하게하기 위해 실제 코드에 포함시키지 않았습니다. – Pithikos

+0

확인. 나는 그것을 보았지만 당신이 두 가지 조건을 시도했는지 궁금해했습니다. 나는 어쨌든 첫 번째 해결책이 있다고 생각한다. 배열 색인을 사용하여 char에 의해 char 문자를 따라 스캔 할 수도 있지만, 전반적인 목표가 무엇인지 확실하지 않습니다. – jonsca

답변

2

문제는 사용자가 sscanf의 반환 값을 테스트하지 않는다는 것입니다. 실패하면 ch이 아니며이 업데이트되므로 마지막 심볼을 두 번 가져온 다음 문자열의 끝 부분을 읽습니다. 당신은 또한 대신 다음 sscanf을 사용하지 않도록하고 할 수

if (sscanf(string+bytesRead, "%c%n", &ch, &bytesTemp) != 1) 
    break; 
+0

나는 그것을 이해하기가 힘듭니다. 왜 실패할까요? 그것은 어떤 점에서 \ 0 문자를 얻지 못합니까? – Pithikos

+1

'ch'는 char입니다. 그것은 "실패"할 수 없습니다. 'sscanf'는 입력 스펙과 일치하지 않으면 실패합니다. 실패하면 (예 : 문자열의 끝에 도달했을 때),'& ch' (또는'& bytesTemp')를 갱신하지 않습니다. 'string + bytesRead'의 첫 번째 문자가''\ 0 ''이면 sscanf가 실패 할 것이기 때문에'ch'는이 sscanf에서 결코'0'으로 설정되지 않을 것입니다. – Mat

+0

그렇지만 sscanf가 실패하는 이유는 무엇입니까? 문자는 전체 ASCII를 나타낼 수 있고 '\ 0'은 ASCII 테이블 안에 있으므로 어떤 점에서는 채널이 '\ 0'을 가질 것으로 예상됩니다. 내 입력 사양은 문자를 읽는 것이고 '\ 0'은 문자이므로 문제가 보이지 않습니다. – Pithikos

0

:

같은 뭔가 시도는 하나 \ n 또는 볼 때

while((ch = *string) != '\n' && ch != '\0') { 
    bytesRead++; 
    printf("Bytes read: %d\n", bytesRead); 
    printf("Variable ch has value: %c\n", ch); 
    string++; 
} 

이 정지 \ 0.

관련 문제