我编写了一个函数,如果找到'o',则会将字符串“ hello world”切为“ hell”。
我不断遇到细分错误。我不知道错误可能在哪里。 有人可以帮忙吗? 预先谢谢你。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* cutString(char* str, char del){
char *newstring =(char*) str;
malloc(sizeof(char)*strlen(str));
int i= 0;
for(; newstring[i]!='\0'&&newstring[i]!=del;i++);
if(i==strlen(newstring))
printf("not found");
else
newstring[i]='\0';
return newstring;
}
int main(){
cutString("Hello World",'o');
return 0;
}
答案 0 :(得分:3)
您的代码有两个主要问题:
char *newstring =(char*) str
使newstring
指向旧的str
。而且,由于您传递文字字符串(只读),因此您将具有未定义行为尝试对其进行修改。
malloc(sizeof(char)*strlen(str));
是内存泄漏。并且不为终结器分配空间。
当您尝试修改只读字符串文字时,崩溃可能是因为第一点。
答案 1 :(得分:1)
newstring[i]='\0';
This line is invalid. Modifying string literals is undefined behavior. I would suggest check this out :segmentation fault when using pointer
A better solution would be to use arrays instead of pointers
答案 2 :(得分:1)
您的代码中存在许多问题。主要问题是您没有将返回值从malloc
分配给newstring
。除此之外,您还需要malloc
一个额外的字节来终止字符串。
此外,您的循环必须将字符从str
复制到newstring
。
在main
中,您必须将函数的返回值分配给char指针变量以获取新字符串。
类似的东西:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* cutString(char* str, char del){
char *newstring = malloc(strlen(str) + 1); // malloc into newstring
int i= 0;
while (newstring[i]!='\0' && str[i] != del) // Stop when a) no more chars in str or b) "del" is found
{
newstring[i] = str[i]; // Copy character from str to newstring
++i;
}
newstring[i]='\0'; // Terminate the string
return newstring;
}
int main(){
char* newstring = cutString("Hello World",'o'); // Save the returned value
printf("%s\", newstring);
free(newstring);
return 0;
}