2015-03-17 4 views
1

Я пытаюсь преобразовать символ строки в верхний регистр буквошибка преобразования символов в строке в верхний регистр

int main (void) 
{ 
    int i = 0; 
    int n = 0; 
    static char *str[] = { "wow", 
          "RACEcar", 
          "No devil lived on.", 
          "rotor" }; 

    for(i = 0; i < strlen(*str); i++) 
    { 
     if(str[i] != NULL) 
     { 
      n = function(str[i]); 
     } 
    } 
    return 0; 
} 

int function(char* x) 
{ 
    int i = 0; 
    int j = strlen(x); 
    char c; 
    for(i = 0; i < j; i++) 
    { 
     c = toupper(x[i]); 
     x[i] = c; 
    } 

    return 0; 
} 

Я получил сообщение об ошибке сказав exc bad access, code 2 в строке, где x[i] = c; я не уверен, почему я получаю это ошибка, мне нужно создать другую строку и назначить c новой строке? toupper возвращает прописную букву символа, но фактически не изменил сам элемент, поэтому я не уверен, что неправильно с присвоением значения return toupper обратно элементу.

+0

i == 0? должно ли оно быть i = 0? –

+0

Да, это была моя опечатка, когда я набираю вопрос здесь, но это не проблема –

+0

Как вы назвали эту функцию? Отправьте эту часть кода. –

ответ

2

Ваш код пытается изменить строковый литерал, что вызывает неопределенное поведение.

Строка "No devil lived on." is не подлежит изменению. Чтобы компилятор поймать ошибку, вы должны объявить массив как:

static char const *str[] = { "wow", // etc. 

По историческим причинам, компилятор должен позволить ему пройти, не нарушая компиляции, если вы забыли включить const. Но тем не менее это все равно ошибка, и некоторые компиляторы все равно будут предупреждать.

Для gcc вы можете использовать флаг -Wwrite-strings, чтобы отключить поддержку исторического случая; это приведет к созданию сообщения об ошибке для вашего кода как есть.