【问题标题】:Segmentation fault cause by touppertoupper导致的分段错误
【发布时间】:2014-05-15 19:51:36
【问题描述】:

所以,我正在尝试编写一个函数,该函数接受一个字符串并将所有小写值更改为大写。代码如下:

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,我就出现了错误? 关于为什么会发生这种情况的任何想法?

【问题讨论】:

  • 正确写:const char* pa = "This is a test.";
  • 这行(x2): 'printf("%s\n%s\n%s", pa)' 有问题。
  • printf("%s\n%s\n%s\n", pa) 的占位符比参数多。

标签: c pointers toupper


【解决方案1】:
 pa = "This is a test.";

在上面的行中,您将指针 pa 设置为指向只读字符串。当您的函数写入该内存时,您正在调用未定义的行为。 (如果你用 -Wall 标志编译你的程序,你会得到一个警告,告诉你这个问题)

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

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

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

【讨论】:

  • 啊,是的,其他 %s 标记是从我的原始代码中遗留下来的,它有更多的测试。我的错。至于指针分配,您的建议奏效了。谢谢一百万!
【解决方案2】:

变化:

   pa = "This is a test.";

到:

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

变化:

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

收件人:

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

而且,也许应该在“return”语句之前调用“free(pa)”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 2011-11-06
    • 2020-12-31
    • 2019-07-21
    • 2018-07-28
    相关资源
    最近更新 更多