对字符串错误进行标记

时间:2014-07-01 20:34:00

标签: c segmentation-fault token

我试图对一些字符串进行标记,以便数字本身是令牌,所以我最终可以添加它们,但我的标记化不起作用,我不知道为什么。它正确编译但是当我执行文件时它会说"分段错误",任何人都知道为什么或如何将这个数字作为令牌?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int stringSum(char *s);
/*void minMaxValues(char *s, int *min, int *max);*/

int main(void)
{
    int value,i;
    char* text[] = { "1 + 2 + 3 + 4",
                     "7",
                     "30 + 20 + 10",
                     "9 + 900 + 90000 + 9000 + 90" };
    for(i=0;i<4;i++) /*send strings to function*/
        stringSum(text[i]);
}

int stringSum(char *s)
{
    char* del = " + ";
    char* token;
    token = strtok(s,del);
    while(token != NULL)
    {
        printf("%s\n",token);
        token = strtok(NULL, del);
    }
}

4 个答案:

答案 0 :(得分:1)

strtok需要可修改的字符串。您在main中定义了一组不可修改的字符串文字,因此他们无法使用strtok

要获得快速解决方案,请使用:

char* temp = malloc(strlen(s) + 1);
strcpy(temp, s);
token = strtok(temp,del);

这会动态分配一个可修改的字符串,其值与您在s中可以使用的strtok相同。

由于这是一个动态分配的变量,请记住在方法结束时释放内存:

free(temp);

您修改后的stringSum方法现在应如下所示:

int stringSum(char *s)
{
    char* del = " + ";
    char* token;

    char* temp = malloc(strlen(s) + 1);
    strcpy(temp, s);
    token = strtok(temp,del);

    while(token != NULL)
    {
        printf("%s\n",token);
        token = strtok(NULL, del);
    }

    free(temp);
    return 0; //or whatever it is that you want to return
}

答案 1 :(得分:0)

函数strtok修改原始字符串。尝试传递char s[]而不是char* s

为什么我们使用char s[]

从此处查看char pointerchar array之间的差异(What is the difference between char s[] and char *s?

答案 2 :(得分:0)

token = strtok(s,del);

strtok函数的规范中,s必须是可写的,但在您的示例中,它是字符串文字。

char* text[] = { "1 + 2 + 3 + 4",
                 "7",
                 "30 + 20 + 10",
                 "9 + 900 + 90000 + 9000 + 90" };

text数组中的所有字符串都是字符串文字,因此无法修改。

答案 3 :(得分:0)

更改第一个参数是非法的strtok是字符串文字不能改变。

替代方案:

#include <stdio.h>
#include <stdlib.h>

int stringSum(const char *s);

int main(void){
    int value, i, size;
    char *text[] = { "1 + 2 + 3 + 4",
                     "7",
                     "30 + 20 + 10",
                     "9 + 900 + 90000 + 9000 + 90"
    };
    size = sizeof(text)/sizeof(*text);
    for(i=0;i<size;i++)
        stringSum(text[i]);

    return 0;
}

int stringSum(const char *s){
    int sum = 0;
    char *endp;
    do{
        int num = strtol(s, &endp, 10);
        if(*endp == ' ' || *endp == '+' || *endp == '\0'){
            sum += num;
            if(*endp)
                s = ++endp;
        } else { //s has invalid character
            fprintf(stderr, "Illegal characters are included.\n");
            break;
        }
    }while(*endp);
    printf("%d\n", sum);
    return sum;
}