【问题标题】:Lowercase to uppercase letters problems in C - segmentation fault [closed]C中的小写到大写字母问题-分段错误[关闭]
【发布时间】:2018-03-12 21:04:29
【问题描述】:

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

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;
}

【问题讨论】:

  • 是的。我能做些什么来纠正它? :
  • 也许但是循环for (i=0 ; i &lt; a-1 ; i++) 是错误的,因为它忽略了字符串中的最后一个字符。 strlen 不包括 nul 终止符。应该是i &lt; a

标签: c segmentation-fault uppercase lowercase


【解决方案1】:

您不能修改string1。事实上,当你声明这样的字符串时

 char* string1 = "HeLlo wOrlD";

字符串可以存储到只读内存区域,这意味着您可以读取它,但不能修改它。 如果你这样做了

char array[] = "hello world";

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

 const char *string1 = "HeLlo wOrlD";

【讨论】:

  • 指针不是字符串,也不是数组本身。 C 没有字符串类型。
  • @Olaf 是的,我有点笨拙,找到合适的词来谈论它并不总是那么容易:(
【解决方案2】:

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

#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

你好

【讨论】:

  • 没必要。
  • @Olaf 是的,但有可能
  • @PeterJ_01 谢谢先生,我从来没有说我的答案是对的,但是通过这次我从你们那里学到了一些新东西,下次我会尝试得更好。
  • 如果您给出答案,您必须百分百确定,这不是积分或声誉竞赛。
  • @PeterJ_01 是的,我同意你的观点,但第一件事是尝试,我正在尝试,从今天开始,我将 100% 确定。
猜你喜欢
  • 2019-08-08
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多