2014-07-21 3 views
0

와 인용 문자열을 감지 :나는 C에서이 같은 파일의 내용을 읽을 수 fscanf

foo="bar" 
alice="bob" 
fruit="pineapple" 

을 내가 키 앨리스과 관련된 특정 값에 관심이 있지만, 주변 따옴표없이 . 그래서, 나는 원한다 bob. 이

EDIT 같은

그래서, 내가 작성한 뭔가 : 키의 추가의 printf/값

char key[20]; 
char value[20]; 
char output[20]; 

memset(key, 0, 20); 
memset(value, 0, 20); 

while(fscanf(fd, "%19[^=]=\"%19[^\"]\"", key, value) != EOF) { 

    printf("%s=%s", key, value); 

    if (strcmp(key, "alice") == 0) { 
     memset(output, 0, 20); 
     strncpy(output, value, 20); 
     break; 
    } 

    memset(key, 0, 20); 
    memset(value, 0, 20); 
} 

이 문제는 strcmp와 결코 아무 키나 사이에, 그래서 comparation를 0을 반환하지 않습니다 "앨리스"는 항상 거짓입니다. 그리고 나는이 결과를 얻고 있습니다 :

foo=bar 
alice=bob 
fruit=pinneaple 
=pineapple 

또한 strlen으로 각 키의 길이를 테스트했는데 정확합니다. 마지막 줄무늬와는 별도로 내가 기대하는 것을 얻는다. 그래서, 나는 정말로 이해하지 못합니다 ...

여기에 명백한 오류가 있습니까? 코드를 디버깅하려고하지만 대상 시스템이 매우 제한적이며 (openwrt) gdb에 액세스 할 수 없습니다 (실제로 코드는 다른 컴퓨터에서 크로스 컴파일됩니다. 컴파일러도 없다).

도움을 주시면 감사하겠습니다.

+0

도움이 될만한 정보가 있습니다. [데모] (http : //regex101.com/r/wR5cQ3/12) – Braj

+0

변수'key'와'value'를 출력하여 실제로 무엇인지 확인할 수 있습니다. 또는 디버거를 사용하여 한 줄씩 단계별로 실행하고 해당 변수의 내용을 확인하십시오. –

+0

감사합니다. 이는 http://www.regexr.com/과 비슷한 것입니다. 하지만 고전 regexp와 scanf 구문의 차이점에 대해서는 잘 모르겠습니다. 나는 틀린 일을 확실히하고있다. – jorgeas80

답변

2

사용자 입력을 위해 scanf()을 사용하지 마십시오 (파일에서 가져온 경우에도 마찬가지 임). fgets()을 선호합니다.

즉각적인 문제는 공백입니다.

파일의 내용은 '\n'입니다. key에는 '\n'이 포함되어 있습니다. 당신이 변환 문자열 내부에 약간의 공간을 추가 fscanf() 시도를 계속 사용하려면

는 :

while (fscanf(fd, " %19[^=]= \"%19[^\"]\"", key, value) == 2) /* ... */; 
//    ^ ^(2nd one isn't as important) 

또한 내가 조건을 변경 알 수 있습니다. EOF에 대한 테스트가 아닌 2의 반환 값을 테스트하십시오.

관련 문제