2015-05-22 9 views
0

Следующий метод приводит к ошибке:Облицовочные ошибки сегментации при использовании ToUpper()

BOOL should_begin(void) { 
    char yn; 
    do { 
     printf("Continue? [Y/N] "); 
     yn = getchar(); 
     printf("\n"); 
     yn = toupper(yn); 
     if (yn == 'N') { 
      return FALSE; 
     } 
    } while (yn != 'Y'); 
    return TRUE; 
} 

Код выполняется до тех пор, как правило, toupper() не будет достигнут, и в этот момент происходит сбой сегментации. Я видел такие вопросы, как toupper() был вызван на часть строки, но это было только тогда, когда кто-то пытался изменить литерал.

Так что же дает? char yn не следует читать только, верно? Это всего лишь char, один байт данных, я не читаю целую строку, не так ли?


EDIT:

Это моя main() функция.

int main(int argc, char* argv[]) { 

    /* just some printf()s with instructions */ 

    if (!should_begin()) { 
     return 0; 
    } 

    /* then continue with rest of the program */ 

    return 0; 
} 
+0

Это в значительной степени полный код. Ничего другого, кроме некоторых # include и # define. –

+1

Надеюсь, вы не пропустили '#include ', не так ли? –

+0

No. Я включил . –

ответ

4

getchar() возвращается int. Некоторые из возвращаемых значений могут не соответствовать char.

Изменить ynint yn.

Тогда из man page для toupper()

int toupper(int c);

If c is not an unsigned char value, or EOF , the behavior of these functions is undefined.

Итак, вам нужно проверить EOF перед передачей yn в toupper().

FWIW, toupper() прототипирован в ctype.h, вы должны #include то же самое.

+1

У вас все получилось. Если в реализации используется массив '1 << CHAR_BITS' для хранения флагов символов и индекса' c' вслепую, это может привести к ошибке сегментации. И спецификации не имеют никаких проблем с этим, и это ответственность программистов. –

+0

Спасибо @MohitJain сэр за добавленное объяснение. :-) –

+1

Альтернативное исправление: 'int input = getchar(); if (input == EOF) {error_handling(); } yn = (unsigned char) input; ' – Lundin

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

  • Нет связанных вопросов^_^