找到一个字符时切断一个字符串

时间:2019-01-07 13:29:47

标签: c arrays string function

我编写了一个函数,如果找到'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;

}

3 个答案:

答案 0 :(得分:3)

您的代码有两个主要问题:

  1. char *newstring =(char*) str使newstring指向旧的str。而且,由于您传递文字字符串(只读),因此您将具有未定义行为尝试对其进行修改。

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