Ошибка сегментации, вызванная toupper

Итак, я пытаюсь написать функцию, которая принимает строку и изменяет все строчные значения на прописные. Вот код:

void lowerToUpper(char *s)                                                      
{                                                                               
    char *p;                                                                                                                                      

    for (p = s; *p; p++)                                                        
    {                                                                                                                                               
         if (islower(*p))                                                                             
             *p = toupper(*p);                                                                                                                                                                               
    }                                                                           
}                                                                               

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

    pa = "This is a test.";                                                                                                

    printf("The following string will be edited:\n");                          
    printf("%s\n%s\n%s\n", pa);                                         

    lowerToUpper(pa);                                                                                                                      

    printf("The string has been edited, and is now as follows:\n");          
    printf("%s\n%s\n%s", pa);                                           

    return EXIT_SUCCESS;                                                        
}

Проблема возникает из-за строки «*p = toupper(*p);», где я получаю ошибку сегментации. Я предполагаю, что проблема возникает из-за попытки присвоить значение, которое toupper(*p) возвращает *p. После некоторых тестов кажется, что toupper(*p) работает, но как только я пытаюсь присвоить значение *p, я seg fault? Любые идеи относительно того, почему это произойдет?


person user3280527    schedule 15.05.2014    source источник
comment
Пишите правильно: const char* pa = "This is a test.";   -  person Hans Passant    schedule 15.05.2014
comment
Эта строка (x2): 'printf (%s\n%s\n%s, pa)' является проблемой.   -  person Mahonri Moriancumer    schedule 16.05.2014
comment
printf("%s\n%s\n%s\n", pa) содержит больше заполнителей, чем аргументов.   -  person slezica    schedule 16.05.2014


Ответы (2)


 pa = "This is a test.";

В приведенной выше строке вы устанавливаете указатель pa на строку символов, доступную только для чтения. Когда ваша функция записывает в эту память, вы вызываете неопределенное поведение. (Если вы скомпилируете свою программу с флагом -Wall, вы получите предупреждение о проблеме)

Правильный способ получить массив символов с возможностью записи:

char pa[] = "This is a test.";

Кроме того, ваши вызовы printf() указывают четыре токена %s, но вы предоставляете только один аргумент строкового указателя. Вам нужно либо удалить три токена %s, либо добавить дополнительные аргументы строкового указателя после pa.

person Jeremy Friesner    schedule 15.05.2014
comment
Ах, да, другие токены %s остались от моего исходного кода, в котором было больше тестов. Виноват. Что касается назначения указателя, ваш совет сработал. Бесконечно благодарен! - person user3280527; 16.05.2014

Сдача:

   pa = "This is a test.";

to:

   pa = strdup("This is a test.");

Сдача:

   printf("%s\n%s\n%s\n", pa);

To:

   printf("%s\n", pa);

И, возможно, 'free(pa)' следует вызывать перед оператором 'return'.

person Mahonri Moriancumer    schedule 15.05.2014