【问题标题】:Delete all duplicated charcters from strings - c从字符串中删除所有重复的字符 - c
【发布时间】:2015-10-07 13:50:29
【问题描述】:

我正在尝试从给定字符串中删除所有重复字符。 例如“asdasd”=“asd”或“abbgga”=“abg”。

当我编译和 cmd 开始运行它时,我收到“停止工作”消息。

这是我的代码:

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

void delMul(char str[]){
    int i,j=0;
    int s[26];
    char k ;
    for ( i = 0; i < 26; i++)
    {
        s[i] = 0;
    }
    for (i = 0; i < strlen(str); i++)
    {
        k = str[i] - 'a'; 
        if(s[k] == 0) {
            s[k]++ ;
            str[j++] = str[i];
        }
    }
    str[j] = '\0';
}

int main(){
    char *str = "asdasd";
    delMul(str);
    puts(str);
}

【问题讨论】:

  • char *str = "asdasd"; 更改为char str[] = "asdasd";,因为在第一种情况下str 是存储在只读内存中的字符串文字。
  • 第一个问题:有 256 个字符,而不仅仅是 26 个,需要允许所有这些字符。第二个问题:数组“asdasd”是一个字符串字面量,而字符串字面量在只读内存中,所以这个语句:str[j++] = str[i];会导致一个seg fault事件。​​
  • 编译时,始终启用所有警告。 (对于 gcc,至少使用:-Wall -Wextra -pedantic)然后修复警告,因此代码可以干净地编译。您可以从变量“k”开始,该变量必须是“int”,而不是“char”
  • 发布的代码,即使经过建议的修复,也会失败,并显示如下字符串:“hello World!”因为发布的代码不处理大写字母、标点符号和空格。
  • 系统函数:strlen() 返回一个无符号的“size_t”。但是,'i' 是 'int' 建议将 int i; 更改为 size_t i; 函数 strlen(); 是一项昂贵的操作。建议只调用一次并保存结果以在“for”循环中使用

标签: c string function


【解决方案1】:

在您的代码中,str 指向一个可能不会被修改的字符串文字。尝试使用由字符串初始化的数组。

【讨论】:

    【解决方案2】:

    在 main 中,您已将 str 声明为指向字符串的指针

    所以存储在程序中分配为固定字符串而不是数据

    因此,当您尝试在第 18 行 str[j++]=str[i] 写入时,会出现 SEGV,因为这是不允许的

    要更正此问题,请将字符串声明为已初始化的 char 数组

    int main(){
        char str[] = "asdasd";
        delMul(str);
        puts(str);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-15
      • 2012-12-16
      • 2014-04-01
      • 2011-08-08
      • 2016-03-03
      • 2021-07-02
      • 2019-04-16
      • 1970-01-01
      相关资源
      最近更新 更多