C - 分段故障中的小写到大写字母问题

时间:2017-10-01 16:44:17

标签: c segmentation-fault uppercase lowercase

当我想运行可执行文件

时,我遇到了分段错误错误
void lowerupper(char *s){
    int i ;

    int a = strlen (s);

    printf("%d\n", a);

    //fails here segmentation fault

    for (i=0 ; i < a-1 ; i++){

        if( (s[i] >= 97) && (s[i] <= 122)){
             s[i] = s[i] - 32;
        }
    }
}

int main(void) {

   char* string1 = 'HeLlo wOrlD';

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

   lowerupper(string1);

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

   return 0;
}

2 个答案:

答案 0 :(得分:1)

您无法修改string1。事实上,当你声明一个像这样的字符串

 char* string1 = "HeLlo wOrlD";

字符串可以存储在READ-ONLY存储区中,这意味着您可以读取它,但不能修改它。 如果你这样做

char array[] = "hello world";

然后它创建一个只读字符串,并将字符复制到array,您将能够修改它(进入array)。 我们邀请您使用关键字const声明只读字符串。

 const char *string1 = "HeLlo wOrlD";

答案 1 :(得分:-1)

您可能已将局部变量的地址传递给该函数。 您应该在堆中分配内存,然后将该变量传递给函数。 这段代码在这里工作:

#include <stdio.h>
#include<string.h>
#include<stdlib.h>

void lowerupper(char *s)
{
    int i ;
    int a = strlen (s);
    printf("%d\n", a);

    for (i=0 ; i < a-1 ; i++)
    {
        if( (s[i] >= 97) && (s[i] <= 122))
        {
             s[i] = s[i] - 32;
        }
    }
}

int main(void) 
{
    char *ss=malloc(10);
    strcpy(ss,"hello\n");
    lowerupper(ss);
    printf("%s",ss);
    return 0;
}

示例输出:

6

您好