2013-11-08 2 views
-1

У меня есть функция, которая принимает массив символов и ищет таблицу для этого конкретного символа, и это соответствующее значение. Я получаю char для поиска с пользовательского ввода с помощью fgets, и когда я передаю буфер функции lookUp, он включает нулевой завершающий символ, который вызывает проблему, поскольку lookUp ищет символ + нулевой терминатор. Мой вопрос в том, есть ли способ «разбить» массив символов его нулевого терминатора или может быть другой способ справиться с этим? Благодарю.Передача массива символов, но не включая нулевой завершающий символ

//lookUp function 
//This function was provided for us, we cannot change the arguments passed in. 
Symbol* lookUp(char variable[]){ 
    for (int i=0; i < MAX; i++){ 
     if (strcmp(symbols[i].varName, variable)==0){ 
      Symbol* ptr = &symbols[i]; 
      return ptr; 
     } 
    } 
    return NULL; 
} 



//main 
int main(){ 
    char buffer[20]; 
    Symbol *symbol; 
    printf("Enter variable to lookup\n"); 
    while (fgets(buffer, sizeof(buffer), stdin)!= NULL){ 
     printf("buffer is : %s\n", buffer); 
     int i = strlen(buffer); 
     printf("length of buffer is %d\n", i); 
     symbol = lookUp(buffer); 
     printf("Passed the lookup\n"); 
     if (symbol == NULL){ 
      printf("Symbol is null\n"); 
     } 
    } 
} 

Выход, символ НЕ должен быть пустым здесь.

Enter variable to lookup 
a 
buffer is : a 
length of buffer is: 2 //this should only be 1 
Passed the lookup 
Symbol is null 

ответ

1

fgets() сохраняет новую строку, если таковая имеется. Вы хотите удалить его. Один из способов сделать это:

while (fgets(buffer, sizeof(buffer), stdin)!= NULL){ 
    char *p = strchr(buffer, '\n'); // new code 
    if(p) *p = 0; // new code  
    printf("buffer is : '%s'\n", buffer); 
    int i = strlen(buffer); 
    printf("length of buffer is %d\n", i); 
2

Нет, это не про завершающего NUL характера. Если вы прочитали руководство от strlen(), вы бы узнали, что он не включает завершающий нулевой байт при подсчете длины. Это символ newline, который fgets() присоединяется к концу строки. И вы можете удалить это, заменив его байтом NUL:

char *p = strchr(buffer, '\n'); 
if (p != NULL) { 
    *p = 0; 
} 
Смежные вопросы