我的代码中有问题,当我运行它时,我在malloc()函数中遇到了分段错误。这是我的代码,我是新来的,如果我写错了就很抱歉。
抱歉我的英文不好!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef char String[50];
bool equalsIgnoreCase(char*,char*);
void main(){
String nome;
printf("Digite um nome: "); //name
scanf("%s",nome);
if(equalsIgnoreCase(nome,"TESTE")){ //test
printf("Strings iguais.");
}else printf("Strings diferentes.");
}
bool equalsIgnoreCase(char *str1 , char *str2){
char *a,*b;
a = malloc(sizeof(char)); //segmentation fault here
b = malloc(sizeof(char));
for(;str1 != '\0';str1++,str2++){
a = tolower(str1);
b = tolower(str2);
if(strcmp(a,b)!=0){
free(a);
free(b);
return false;
}
}
free(a);
free(b);
return true;
}
答案 0 :(得分:4)
在这种情况下,您不应该使用malloc()
和free()
。它们导致内存泄漏。
另请注意,从tolower()
返回的是字符,而不是指针。将它转换为指针几乎没有机会产生有效的指针。
将从tolower()
传递到char
的内容转换为unsigned char
是好的,因为char
可能已签名并且传递的范围不在unsigned char
范围内{ {1}} EOF
调用未定义的行为。
另一点是tolower()
不是判断str1 != '\0'
是否指向字符串结尾的正确方法,而且还应检查str1
。
最后,您应该将str2
用于不需要修改的字符串。
您的代码应该是这样的:
const char*
或使用bool equalsIgnoreCase(const char *str1 , const char *str2){
for(;*str1 != '\0' && *str2 != '\0';str1++,str2++){
if(tolower((unsigned char)*str1) != tolower((unsigned char)*str2)){
return false;
}
}
return true;
}
和a
,如下所示:
b
也不要忘记
bool equalsIgnoreCase(const char *str1 , const char *str2){
int a, b;
for(;*str1 != '\0' && *str2 != '\0';str1++,str2++){
a = tolower((unsigned char)*str1);
b = tolower((unsigned char)*str2);
if(a != b){
return false;
}
}
return true;
}
的原型声明更改为equalsIgnoreCase
以匹配新功能。bool equalsIgnoreCase(const char*,const char*);
以使用#include <ctype.h>
。tolower()
的返回类型更改为main()
以符合标准。答案 1 :(得分:0)
这段代码有很多错误。
首先让我说C已经有一个函数来比较忽略区分大小写的字符串,它叫stricmp()
,并且非常像strcmp()
,除非忽略大小写,你没有写自己的。
需要指出的另一个重要事项是a
,b
,str1
和str2
都是指针。
当你执行a = tolower(str1)
时,你没有做任何有意义的事情,因为str1
不是一个字符,它是一个指针,你也失去了对你刚分配的内存的引用,并试图堆栈中的free()
内存无效。这样做的一种正确方法是*a = tolower(*str1)
。
此外,唯一符合1 char
长度的字符串是空字符串。 C中的字符串以空值终止,这意味着您需要2 char
来创建一个包含1个字符的字符串,因为它必须后跟\0
才能成为有效的C字符串。
如other answer所指出的那样,在malloc()
使用此处也毫无意义。
答案 2 :(得分:0)
代码中有两个错误,可能会导致细分错误。
for(;str1 != '\0';str1++,str2++){
比较str2和'\ 0',否则它将用完str2。
if(strcmp(a,b)!=0){
strcmp在这种情况下需要char *和两个字节,但a和b只有sizeof(char),只有一个字节。
*a != *b
最后,我修复了分段错误,但 equalsIgnoreCase 仍然是逻辑错误,请自行完成。 `
bool equalsIgnoreCase(char *str1 , char *str2){
char *a,*b;
a = (char*)malloc(sizeof(char)); //segmentation fault here
b = (char*)malloc(sizeof(char));
//for(;str1 != '\0';str1++,str2++){
for(;*str1 != '\0' && *str2 != '\0';str1++,str2++){
*a = (char)tolower((int)*str1);
*b = (char)tolower((int)*str2);
//if(strcmp(a,b)!=0){
if (*a != *b) {
free(a);
free(b);
return false;
}
}
free(a);
free(b);
return true;
}`