C-切分错误中的小写字母到大写字母问题

C-切分错误中的小写字母到大写字母问题,c,segmentation-fault,uppercase,lowercase,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)){

当我想运行可执行文件时,出现了分段错误

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;
}
void lowerupper(字符*s){
int i;
int a=斯特伦(s);
printf(“%d\n”,a);
//在分割错误中失败
对于(i=0;i如果((s[i]>=97)&&(s[i]您可能正在将局部变量的地址传递给函数。
您应该在堆中分配内存,然后将该变量传递给函数。
此代码在此处工作:

#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;
}
#包括
#包括
#包括
void lowerupper(字符*s)
{
int i;
int a=斯特伦(s);
printf(“%d\n”,a);
对于(i=0;i如果((s[i]>=97)&&(s[i]您不能修改
string1
。事实上,当您声明这样的字符串时

 char* string1 = "HeLlo wOrlD";
字符串可以存储在只读内存区域中,这意味着您可以读取它,但不能修改它。 如果你这样做

char array[] = "hello world";
然后它创建一个只读字符串,并将字符复制到
数组
,您将能够修改它(到
数组
)。 我们邀请您使用关键字
const
声明只读字符串

 const char *string1 = "HeLlo wOrlD";

是的。我能做些什么来纠正它呢?:也许,但循环
for(i=0;i
是错误的,因为它忽略了字符串中的最后一个字符。
strlen
不包括
nul
终止符。它应该是
i
指针不是字符串,也不是数组本身。C没有字符串类型。@Olaf是的,我有点笨拙,要找到合适的词来谈论这个问题并不总是容易的:(没有必要。@Olaf是的,但可能是possible@PeterJ_01谢谢,先生,我从来没有说过我的答案是对的,但是通过这次我从你们身上学到了一些新的东西,下次我会做得更好。如果你给出答案,你必须百分之百肯定,这不是分数或声誉竞赛。@PeterJ_01是的,我同意你们的观点,但第一件事是尝试d我正在努力,从今天学到的下次开始,我会百分之百确定。