1

我写了一个代码来用多个字符分隔符分割字符串。

第一次调用此函数工作正常

但我第二次调用它时,它会用一些不需要的符号重新调整正确的单词。

我认为出现这个问题是因为没有清除缓冲区。我尝试了很多但无法解决这个问题。请帮我解决这个问题。

char **split(char *phrase, char *delimiter) {
    int i = 0;
    char **arraylist= malloc(10 *sizeof(char *));
    char *loc1=NULL;
    char *loc=NULL;
    loc1 = phrase;
    while (loc1 != NULL) {
    loc = strstr(loc1, delimiter);
    if (loc == NULL) {
            arraylist[i]=malloc(sizeof(loc1));
            arraylist[i]=loc1;
            break;
    }
    char *buf = malloc(sizeof(char) * 256);    // memory for 256 char
    int length = strlen(delimiter);
    strncpy(buf, loc1, loc-loc1);
    arraylist[i]=malloc(sizeof(buf));
    arraylist[i]=buf;
    i++;
    loc = loc+length;
    loc1 = loc;
}
return arraylist;
}

第一次调用这个函数

char **splitdetails = split("100000000<delimit>0<delimit>hellooo" , "<delimit>");

它给

splitdetails[0]=100000000
splitdetails[1]=0
splitdetails[2]=hellooo

但我第二次打电话

char **splitdetails = split("20000000<delimit>10<delimit>testing" , "<delimit>");

splitdetails[0]=20000000��������������������������
splitdetails[1]=10����
splitdetails[2]=testing

更新:-

感谢@fatelerror。我已将我的代码更改为

    char** split(char *phrase, char *delimiter) {
    int i = 0;
    char **arraylist = malloc(10 *sizeof(char *));
    char *loc1=NULL;
    char *loc=NULL;
    loc1 = phrase;
    while (loc1 != NULL) {
    loc = strstr(loc1, delimiter);
    if (loc == NULL) {
            arraylist[i]=malloc(strlen(loc1) + 1);
            strcpy(arraylist[i], loc1);
            break;
    }
    char *buf = malloc(sizeof(char) * 256);    // memory for 256 char
    int length = strlen(delimiter);
    strncpy(buf, loc1, loc-loc1);
    buf[loc - loc1] = '\0';
    arraylist[i]=malloc(strlen(buf));
    strcpy(arraylist[i], buf);
    i++;
    loc = loc+length;
    loc1 = loc;
   }
}  

在调用者函数中,我将其用作

char *id
char **splitdetails = split("20000000<delimit>10<delimit>testing" , "<delimit>");
id = splitdetails[0];
//some works done with id
//free the split details with this code.
for(int i=0;i<3;i++) {
    free(domaindetails[i]);
}free(domaindetails);
domaindetails=NULL;    

然后我给第二个打了电话,

char **splitdetails1= split("10000000<delimit>1000<delimit>testing1" , "<delimit>");

它会出错,我无法释放该功能。

提前致谢。

4

1 回答 1

3

您的问题归结为三个基本问题:

  1. sizeof不是strlen()
  2. 赋值不会复制 C 中的字符串。
  3. strncpy()并不总是以 nul 结尾的字符串。

所以,当你说这样的话:

arraylist[i]=malloc(sizeof(loc1));
arraylist[i]=loc1;

这不会复制字符串。第一个分配 的大小loc1,即 a char *。换句话说,您分配了指针的大小。您想分配存储来存储字符串,即使用strlen()

arraylist[i]=malloc(strlen(loc1) + 1);

还要注意+ 1,因为您还需要空终止符的空间。然后,复制您要使用的字符串strcpy()

strcpy(arraylist[i], loc1);

你拥有它的方式只是为你的旧字符串分配一个指针(并且在这个过程中你刚刚分配的内存)。strdup()结合这两个步骤也很常见,即

arraylist[i] = strdup(loc1);

这很方便,但strdup()不是官方 C 库的一部分。在考虑使用代码之前,您需要评估代码的可移植性需求。

此外,使用strncpy(),您应该知道它并不总是nul 终止:

strncpy(buf, loc1, loc-loc1);

这复制的字节数少于原始字符串中的字节数,并且不会终止buf。因此,有必要自己包含一个 nul 终止符:

buf[loc - loc1] = '\0';

这是您看到垃圾的根本原因。由于您没有 nul 终止,因此 C 不知道您的字符串在哪里结束,因此它会继续读取内存中发生的任何内容。

于 2013-03-14T05:51:10.263 回答