2016-08-04 2 views
2

У меня возникли проблемы с печатью. Когда я попросил пользователя вставить int, он сработал, но при попытке переключить его на вход char он получил завихрение и ничего не печатает.Печать после разделения строки текста на разделителях

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

int main() { 
    const char delim[2] = ","; 
    char *token; 
    int j = 0; 
    char *hh; 
    FILE *ptr_file; 
    char buf[1000]; 

    ptr_file = fopen("input.txt", "r"); 
    if (!ptr_file) 
     return 1; 

    char *pt[] = { "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na" }; 

    printf("what element do you want(Use atomic number)"); 
    scanf("%s", &hh); 

    for (j = 0; j <= 3; j++) { 
     if (hh == pt[j]) { 
      fgets(buf, 1000, ptr_file); 
      token = strtok(buf, delim); 
      while (token != NULL) { 
       printf("%s\n", token); 
       token = strtok(NULL, delim); 
      } 
      break; 
     } else { 
      fgets(buf, 1000, ptr_file); 
      continue; 
     } 
    } 

    fclose(ptr_file); 
    return 0; 
} 

ответ

5

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

Вы должны сделать hh массив, как char hh[8] = {0}; и использовать scanf() таким образом:

scanf("%7s", hh); // to avoid buffer overflow 

Это сказал,

  • if(hh == pt[j]) не способ сравнения строк . Для этого вам нужно использовать strcmp() и написать if (strcmp(hh, pt[j]) == 0).
  • вы также должны проверить возвращаемое значение scanf(), чтобы проверить, правильно ли преобразован вход.
+0

Итак, как я могу это сделать? – John

+0

@christian Вы уже попробовали то, что я предложил? –

0

Код

char *hh; 
//... 
scanf("%s", &hh); 

это UB благодаря hh неинициализированным: это указывает на мусор. Кроме того "%s" спецификатор формата хочет char * в качестве передаваемого параметра: вы передаете char **

должен быть

char *hh = malloc(MAX_STRING_LEN); 
if (hh != NULL) 
{ 
    //... 
    scanf("%s", hh); 
} 
free(hh); 

или просто

char hh[MAX_STRING_LEN] = {0}; 
//... 
scanf("%s", hh); 

В обоих примерах MAX_STRING_LEN выражает максимально допустимый длину строки + 1 для нулевого терминатора.


Используя нельзя сравнивать строки, используя логический оператор ==, поэтому код

if(hh == pt[j]) 

сравнивает адреса не строки. Вы можете использовать strcmp для этого.

+0

Я пробовал и давал error.error: 'MAX_STRING_LEN' uneclared (первое использование в этой функции) char hh [MAX_STRING_LEN] = {0}; – John

+1

@christian MAX_STRING_LEN был всего лишь индикатором того, что вы должны указать максимальную длину строки, которая вам понадобится. – Caw

+0

А я идиот – John

Смежные вопросы