【发布时间】: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”循环中使用