分段故障?字符串标记化

时间:2014-06-29 21:23:55

标签: c c89

我正在尝试编写一个函数,将数组中的字符转换为整数,这样我就可以为每个组生成一个总和或其他数学过程。我知道首先我必须使用strtok去掉空格和'+'。我一直试图首先至少开始让strtok工作,但是当我尝试运行它时它一直说分段错误。

有任何帮助吗?

#include <string.h>
#include <stdio.h>
int main(void)
{
    char* string[] = { "10 + 20", "1 + 3 + 6 + 8" };
    sum(string[0]);
}

int sum(char* s)
{
    char *stringcopy = malloc( strlen(s) + 1 );     
    char* del = " +";                                  
    char* token;
    int i;

    stringcopy = s;   /* 'copy' problem here */             

    token = strtok(stringcopy, del);
    while( token ) {
       printf("%s\n", token);
       token = strtok(NULL, del);
    }
    return 11;   /* placeholder until I get the sum */
}

4 个答案:

答案 0 :(得分:4)

有一个简单的原因strtok为您提供了细分错误:

您正在字符串文字上运行它,尽管类型char[n]是一个不可变对象 strtok修改您运行它的任何字符串!

解决方法很简单:在副本上运行。这里有一个复制字符串的函数(大多数C库提供这个非标准函数为char* strdup(const char*)

char* my_strdup(const char* s) {
    size_t size = strlen(s)+1;
    char* ret = malloc(size);
    if(ret)
        memcpy(ret, s, size);
    return ret;
}

以后不要忘记free()副本。

你试过这样做,但是在开始一个良好的开始并为malloc保留字符串的空间之后,你只需通过将指向文字的指针分配给同一个指针来丢弃它(内存泄漏)。 / p>

答案 1 :(得分:1)

这一行不符合你的想法:

textcopy = s;   /* making copy for strtok */             

这里没有复制字符串。所有发生的事情是,而不是指向刚刚为其分配的内存块的第一个字节(使用malloc( strlen(s) + 1 )), textcopy现在直接指向您作为"10 + 20"传递给stringSum的文字字符串s的第一个字节。

你可能想要像strcpy(textcopy, s)这样的东西。我之前曾建议过strncpy; strncpy(textcopy, s, strlen(s)) + 1可能有效,但(正如评论所解释的)在这种情况下使用似乎毫无意义。

答案 2 :(得分:1)

本声明

textcopy = s;   /* making copy for strtok */

不符合您的想法。

实际上我们有一个内存泄漏,因为一开始你分配内存和textcopy得到了存储的第一个字节的地址

char *textcopy = malloc( strlen(s) + 1 );

然后你重新分配了textcopy。

textcopy = s;   /* making copy for strtok */

您必须使用标准功能strcpy

strcpy( textcopy, s );   /* making copy for strtok */

如果函数声明为

,也会更好
int stringSum(const char* s);

答案 3 :(得分:0)

该行

textcopy = s;   /* making copy for strtok */             

不会复制s并将其放入textcopy。相反,您需要使用:

strcpy(textcopy, s);