toupper引起的分段错误

1 c pointers 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;                                                        
}
Run Code Online (Sandbox Code Playgroud)

问题来自"*p = toupper(*p);"这一行,这是我得到分段错误的地方.我的猜测是问题出现在尝试分配toupper(*p)返回*p的值.在做了一些测试之后,似乎toupper(*p)工作,但是一旦我尝试将值赋给*p,我就会出错?有关为什么会发生这种情况的任何想法?

Jer*_*ner 7

 pa = "This is a test.";
Run Code Online (Sandbox Code Playgroud)

在上面的行中,您将指针pa设置为指向只读字符串.当您的函数写入该内存时,您正在调用未定义的行为.(如果使用-Wall标志编译程序,则会收到警告,告诉您有关该问题的信息)

获取可写char数组的正确方法是:

char pa[] = "This is a test.";
Run Code Online (Sandbox Code Playgroud)

此外,您对printf()的调用指定了四个%s标记,但您只提供一个字符串指针参数.您需要删除三个%s标记,或者在pa之后添加其他字符串指针参数.