2017-02-08 8 views
1

/* 배열에 토큰을 저장하는 코드가 정확한지 확신 할 수 없습니다. 내 프로그램을 실행할 때마다 token[0]을 내 변수와 비교하는 코드는 출력을 제공하지 않으며 할당 된 기능을 수행하지 않기 때문에 그렇습니다.문자열 토큰을 저장하고 내용을 배열에 저장 한 다음 해당 내용을 추가 비교에 사용하는 방법

는 그러므로 나는 나의 코딩에 대한 부정확 한 뭔가가 확신합니다. */

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    //variable declarations   
    const char *array[] = {"ax","bo","cf"}; 
    char delim[]=" \n"; 
    char* myline; 
    size_t max = 500; 
    char* token1; 
    char* token2[max]; 
    int n = 0; 


    while(1) //loop always 
    {  
     printf("Enter an argument\n"); //asks for an input 


     getline (&myline, &max, stdin);  //read the input/line    

     //for loop -- splits up the line into tokens 
     for(token1 = strtok(myline, " "); token1 != NULL; token1 = strtok(NULL, delim)) 
     {     

     token2[n] = malloc(strlen(token1)+1);  //allocate some space/memory to token2[n] 

     //save the token in an array by copying from token1 to token2 
     strcpy(token2[n],token1); 


     int m; 

     for(m = 0; m<sizeof(array);m++) //loop through the array elements for comparison 
     { 
      //compare array at index m with token at index 0 -- compare only first token with a specific variable 

      if(strcmp(token2[0], array[m]) == 0) 
      { 
       printf("equal"); 
      } 
     } 
     } 

    free(token2[n]);  //deallocate assigned memory 
    }  
return(0); 
} 
+0

코드의 유일한 문제점은 스타일이며'malloc'의 반환 값을 확인하지 못하는 것입니다. –

+1

어디서 읽습니까? –

+1

getline – Atinuke

답변

0

난 당신이

벡터와 같은 문자열의 벡터를 시도해야한다고 생각 < 문자열> STR = { "도끼", " 보 ","cf "};

+0

이것은'C++'입니다. OP가 질문을 'c'에 태그를 달아서 유용하다고 생각하지 않습니다. – RoadRunner

0

현재 코드에서 몇 가지 문제가 될 그들의 보인다

  • for(m = 0; m<strlen;m++)이 올바르지 않습니다. strlen()은 C 문자열의 길이를 얻는 데 사용되는 <string.h> 함수입니다. array[i]을 원하므로 가드에 array 크기를 포함시켜야합니다. 배열의 크기를 찾으려면 sizeof(array)/sizeof(array[0])을 사용할 수 있습니다.

    #define ARRAYSIZE(x) (sizeof x/sizeof x[0]) 
    

    그런 다음 루프가 될 수 있습니다 :

    size_t m; 
    for(m = 0; m<ARRAYSIZE(array); m++) 
    
  • 당신은 malloc()의 반환을 확인할 필요가 공간을 할당 실패 NULL를 반환 할 수 있습니다, 매크로이 포함 좋은 것 .

    token2[n] = malloc(strlen(token1)+1); 
    if (token2[n] == NULL) { 
        /* handle error */ 
    
  • 단순히 strdup를 사용하여 malloc()/strcpy() 단계를 생략 할 수있다 : 여기서 이것을 확인하는 방법이다.

  • getline() 줄을 읽지 못하면 -1이 반환되므로이 점을 확인하는 것이 좋습니다. 또한 버퍼 끝에 \n 문자를 추가하므로 이것을 제거해야합니다. 그렇지 않으면 strcmp은 동일한 문자열을 찾지 않습니다. strcmp("string\n", "string")을 비교합니다. 버퍼에 \n 문자가 있고 \0 null 종결 자로 바꿔야합니다.

    이 같은를 얻을 수 있습니다 또한 token2[]free()char* 포인터의 모든 필요

    size_t slen = strlen(myline); 
    if (slen > 0 && myline[slen-1] == '\n') { 
        myline[slen-1] = '\0'; 
    } 
    
  • .

  • strtok()에 대해 동일한 delimeter를 사용하고 있으므로이 값을 const으로 만드는 것이 좋습니다. 그래서 const char *delim = " \n";.

의견에 제안 된 수정 프로그램 중 많은 부분이 있으므로 제안 사항으로 코드를 업데이트 한 것으로 보이므로 여기에 게시하지 않았습니다.

+0

그들을 밖으로 시도 .... – Atinuke

+0

@Atinuke 이러한 문제는 코드를 디버깅하는 데 도움이됩니다. – RoadRunner