strtok 没有 return 任何值

strtok doesn't return any value

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

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

这是我的代码:

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

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

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

请注意,您不需要 return 来自 string_to_array() 的输入指针 myArray 并将其分配给 main() 中的 myArray 因为原始数组已修改。

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