strtok不返回任何值

时间:2019-09-17 07:53:30

标签: c strtok

我想编写一个程序,将数字(“ 1 2 3”)的字符串转换为整数数组。但是strtok()不返回值。为什么不? 我的控制台输出为空。

编辑:我没有收到错误消息。

这是我的代码:

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

int* string_to_array(char * string, int * myArray);

int main(void) {
    int* myArray = 0;
    myArray = (int*) malloc(10 * sizeof(int));
    myArray = string_to_array("1 2 3 4", myArray);

    printf("result: %d\n", myArray[0]);
    printf("result: %d\n", myArray[1]);
    return 0;
}

int* string_to_array(char * string, int * myArray){
    char delimiter[] = " ";
    char *ptr;
    char *ptr2;
    long ret;

    printf("string_to_array() was called.\n");
    printf("string is: %s\n", string);

    ptr = strtok(string, delimiter);            // here is the problem
    printf("strtok done; ptr: %s\n", ptr);

    int index = 0;
    while(ptr != NULL) {        
        ret = strtol(ptr, &ptr2, 10);
        printf("ret: %d\n", ret);
        myArray[index] = ret;
        ptr = strtok(NULL, delimiter);
        index++;
    }

    return myArray;
}

2 个答案:

答案 0 :(得分:4)

由于使用strtol来解析值,因此请使用ptr2遍历string。转换后,ptr2将指向转换后的下一个字符。将其用作下一次转换的起点。可以使用strtol完成更多错误检查。

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

int* string_to_array(char * string, int * myArray);

int main(void) {
    int* myArray = 0;
    myArray = (int*) malloc(10 * sizeof(int));
    myArray = string_to_array("1 2 3 4", myArray);

    printf("result: %d\n", myArray[0]);
    printf("result: %d\n", myArray[1]);
    return 0;
}

int* string_to_array(char * string, int * myArray){
    char *ptr;
    char *ptr2;
    long ret;

    printf("string_to_array() was called.\n");
    printf("string is: %s\n", string);

    ptr = string;

    int index = 0;
    while(*ptr) {
        ret = strtol(ptr, &ptr2, 10);
        printf("ret: %ld\n", ret);
        myArray[index] = ret;
        ptr = ptr2;
        index++;
    }

    return myArray;
}

答案 1 :(得分:4)

正如rafix07在他的评论中所写,您不能将strtok与像"1 2 3 4"这样的字符串文字使用。因此,在我的系统上,我在strtok中遇到了分段错误。

要使用数组而不是字符串文字,可以按如下所示修改程序:

int main(void) {
    int* myArray = 0;
    char input[] = "1 2 3 4"; /* This initializes a writable array with the string literal */

    myArray = (int*) malloc(10 * sizeof(int));
    myArray = string_to_array(input, myArray); /* pass array instead of literal */

    printf("result: %d\n", myArray[0]);
    printf("result: %d\n", myArray[1]);
    return 0;
}

不是strtok修改您的原始数据。如果您不希望这样做,则可以使函数string_to_array处理数据副本。进行此修改后,您可以像在原始main函数中那样使用字符串文字来调用它。

int* string_to_array(char * string, int * myArray){
    char delimiter[] = " ";
    char *ptr;
    char *ptr2;
    long ret;
    char *data;
    data = strdup(string);

    /* FIXME error handling for strdup */

    printf("string_to_array() was called.\n");
    printf("string is: %s\n", string);

    ptr = strtok(data, delimiter);            // here is the problem
    printf("strtok done; ptr(%p): %s\n", ptr, ptr);

    int index = 0;
    while(ptr != NULL) {        
        ret = strtol(ptr, &ptr2, 10);
        printf("ret: %ld\n", ret);
        myArray[index] = ret;
        ptr = strtok(NULL, delimiter);
        index++;
    }

    free(data);
    return myArray;
}

请注意,由于原始数组已修改,因此不需要从myArray返回输入指针string_to_array()并将其分配给myArray中的main()

您的函数string_to_array()不知道您分配了数组的大小。我建议将元素数量作为函数参数传递,并检查是否没有在数组末尾后面写。您也不会返回实际填充数据的myArray中的元素数量,因此main函数可能会访问未初始化的元素。