【问题标题】:Tokenizing a string error标记字符串错误
【发布时间】:2014-07-01 20:33:59
【问题描述】:

我试图标记一些字符串,以便数字本身就是标记,因此我最终可以添加它们,但我的标记化不起作用,我不知道为什么。它编译正确,但是当我执行文件时显示“分段错误”,任何人都知道为什么或如何将数字作为标记?

#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);
    }
}

【问题讨论】:

    标签: c segmentation-fault token


    【解决方案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
    }
    

    【讨论】:

      【解决方案2】:

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

      为什么我们使用char s[]

      从这里查看char pointerchar array 之间的区别 (What is the difference between char s[] and char *s?)

      【讨论】:

        【解决方案3】:
        token = strtok(s,del);
        

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

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

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

        【讨论】:

        • 所以我可以将传入的字符串文字复制到可修改的数组中并继续工作?
        • @user3686360 例如,是的
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2020-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多