2013-12-18 3 views
3

문자열 비교가 올바르게 비교되지 않는 이유를 알 수 없습니다. 이것은 C.C에서 문자열 비교가 올바르게 작동하지 않습니다

입니다 그것은 다음과 같이 설정 파일에서 읽는 것

:

1 - ls    
2 - cd     
3 - history    

내가 입력하면이 'C'로 시작 마지막으로 사용 된 문자열을 잡아하고 실행하는 가정 것 c를! 명령. 그러나 if (strcmp (()) = 0) 행에는 절대 들어 가지 않습니다. 내 코드의

부분은 여기에 있습니다 :

char currLine[MAXINPUTLINE]; 

    else if (isalpha(input[1])){ 
     int count = 1; 
     fileRead = fopen(".simpleshell_history", "r"); 
     while(fscanf(fileRead, "%s\n", currLine) != EOF){ 
      printf(input+1); 
      printf(currLine); 
      if(strcmp((input+1), currLine) == 0){ 
       printf("%s\n", currLine); 
       parse(currLine); 
      } 
     } 
    } 

이 while 루프 인쇄에서의 printf, 나는이 문제를 해결하는 방법을 알아낼 수 없습니다 나는 잠시 동안 붙어 봤는데 무엇인가 . 내가

c 
1c 
-c 
lsc 
2c 
-c 
cdc 
3c 
-c 
historyc 
4c 
-c 
!c!c 
+1

를? – klm123

+0

무엇을 의미합니까? 지금은 if 문으로 가서 currLine을 출력한다고 가정하고 있지만 while 루프를 통해서만 반복하고 if 문으로는 진행하지 않습니다. – user2318083

+1

당신은 거기에 printf를 가지고 있습니다. 그들은 무엇을 인쇄합니까? – klm123

답변

1

input 문자열 !c이며 라인 2 - cd에 대해, 당신이 조심해야 할 것이라고 일치하도록 찾고 있습니다. strcmp은 정확하게 비교할 수있는 두 문자열이 정확히 일치하는 경우에만 성공을 반환하므로 명확하게 작동하지 않습니다.

한 문자열 (cd)이 다른 문자열 (c)로 시작하는지 테스트하려면 strncmp()을 사용하고 비교할 문자 수에 제한이 있습니다.

또한 : 있습니다 (!을 건너 뛰는) input의 두 번째 문자로부터합니다 (2 - 문자를 건너 뛰는) currLine의 다섯 번째 문자에서 비교 시작하도록주의해야합니다.

이 당신은 거기에 도착한다 : 당신이 출력에서이 일을

while (fgets(currLine, sizeof currLine, fileRead) != NULL) { 
     printf(input+1); 
     printf(currLine); 
     if (strncmp(input + 1, currLine + 4, strlen(input)-1) == 0) { 
      printf("%s\n", currLine); 
      parse(currLine); 
     } 
    } 
+0

당신의 해결책을 시도했지만, 여전히 if 문으로 들어 가지 않습니다.내 답변에 while 루프의 출력을 아래에 표시했습니다. – user2318083

+1

다른 곳에서 제안 된대로'input'는 말미의 개행 문자를 가지고 있습니까? 그렇다면'currLine'에서'input'의 개행과'd'를 비교하려고 시도하는 대신'strlen (input) -2'을 시도하십시오. –

+0

네가 맞다. 지금은 printf하지만 필요하지 않은 번호를 포함한 전체 줄을 인쇄하지만, 간단한 수정이라고 생각한다. 적어도 나는 희망한다. 예를 들어 "역사"대신에 "3 - 역사"를 프린트한다. – user2318083

1

하나의 가능성은 입력이 뒤에 줄 바꿈을 포함 할 수 있다는 것입니다! 'C'를 입력 할 때입니다 동안 curline은 확실히 때문이 아니라는 scanf 사양.

+0

당신은 문자열의 끝 부분에 '\ n'이 뒤에 오는 첫 번째 글자를 비교하는 것이 맞지 않습니까? 그래서 그건 상관 없겠지? – user2318083

+1

아니요, strcmp는 전체 문자열을 비교합니다. 첫 글자를 비교하고 싶다면 do (input [1] == curline [1]) –

+0

흠. "1 -"은 문자열 비교를 전혀 방해하지 않습니까? – user2318083

1

당신의 문제는 당신이 input을 얻는 방식입니다. (인쇄 할 때 줄 바꿈이 있음). 그 뒤에는 \n이고 currLine은 없습니다. 따라서 비교가 실패합니다.

제안 OP는 사용자 입력과 파일 입력 모두에 fgets()을 사용합니다.

뭔가

char buf[MAXINPUTLINE]; 
while(fgets(buf, sizeof buf, fileRead) != NULL) { 
    int LineNo; 
    if (sscanf(buf, "%d - %s", &LineNo, currLine) != 2) Handle_UnexpectedInput(); 
    ... 
} 

같은

참고 : 다음 %s 건너 뛰고 옵션 선두 공백 아닌 공백을 검색 : "%s\n""%s " 같은이 같은 "%s\t" 등을 수행한다. s 이후의 공백은 "%s\n"에서 선택 공백을 검색합니다.

+0

어쩌면 나는 이것을 포함시켜야했는데, 나는 그 코드 전부 전에 "while (fgets (input, sizeof (input), stdin)) {"을 가지고있다. 그래서 fgets() "input" – user2318083

+1

@ user2318083 예, "! c \ n"을 얻습니다. – chux

+0

그래서 그냥 입력에서 '\ n'을 얻거나 currLine에 추가 할 필요가 있습니까? – user2318083

2

이 루프 :

while(fscanf(fileRead, "%s\n", currLine) != EOF) { 

는 공백 currLine 오히려 선 이상으로 토큰을 delimeted 읽습니다. 따라서 첫 번째 반복은 1이고, 두 번째는 -이고, 세 번째는 ls입니다. printfs에서 볼 수 있습니다. currLine이라는 이름은 토큰이 아닌 줄을 읽고 싶다고 제안합니다.

그런 다음 읽은 토큰을 입력란의 나머지 부분과 비교하면 분명히 "c\n"입니다. 개행 문자로 토큰을 얻지 못하기 때문에 절대 일치하지 않습니다. 당신이 줄 바꿈 제거되었다하더라도 파일이

당신은 당신의 접두사에 대해 입력 라인의 나머지 부분을 비교하고 싶은 말은 토큰 c

편집을 포함하지 않는 한, 그것은 일치하지 않을 것 명령에 라인. 우선 접두어의 길이를 알아 내고 싶다면 strncmp를 사용하십시오. 또한 파일에서 행을 구문 분석하여 명령을 색인과 구별하려고합니다.그래서 당신이 뭔가를 할 수 :

else if (isalpha(input[1])){ 
    int count = 1; 
    int pfxlen = 1; 
    while (!isspace(input[pfxlen+1])) pfxlen++; 
    fileRead = fopen(".simpleshell_history", "r"); 
    while(fscanf(fileRead, "%d - %[^\n]", &index, currLine) == 2) { 
     if(strncmp((input+1), currLine, pfxlen) == 0) { 
      printf("%s\n", currLine); 
      parse(currLine); 
     } 
    } 
} 
+0

당신은 맞습니다. 나는 다소 우둔 해. – user2318083

+0

어떻게해야하는지 알아 내려고합니다. "올바르게 작동하지 않습니다"라고 말하면서 어떻게해야하는지 말하지 마십시오. –

+0

그래서 "\ n"을 입력으로부터 꺼내야 만하고 어떻게 든 전체 토큰 대신 첫 번째 문자 만 비교할 수 있을까요? – user2318083

관련 문제