strtok函数没有返回任何值

3
我想编写一个程序,将带有数字的字符串(“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;
}

6
你不能在字符串字面值即"1 2 3 4"上调用strtokstrtok会修改它的第一个参数,而字符串字面值只能被读取。请将"1 2 3 4"放入字符数组中。 - rafix07
2
https://en.cppreference.com/w/c/language/string_literal - rafix07
1
另外:考虑使用整洁的写法:myArray = malloc(sizeof * myArray * 10); 而不是 myArray = (int*) malloc(10 * sizeof(int)); - chux - Reinstate Monica
1
"kame,"字符串和字符数组是相同的。但如果不是,它们有什么区别?" --> char s[]和char *s之间有什么区别? - chux - Reinstate Monica
1
@kame 我需要对malloc的结果进行强制类型转换吗? 是一篇有趣的阅读。但是我不会因为这只是一个小问题而修改这个问题。 - chux - Reinstate Monica
显示剩余3条评论
2个回答

4

由于使用 strtol 解析值,因此使用 ptr2 迭代遍历字符串。转换后,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;
}

4
rafix07 在评论中所说,你不能使用像 "1 2 3 4" 这样的字符串字面值与 strtok 一起使用。在我的系统上,因为这个原因,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;
}

请注意,你不需要从 string_to_array() 返回输入指针 myArray 并将其分配给 main() 中的 myArray,因为原始数组已经被修改。
建议在函数参数中传递元素数量并检查您是否没有写入数组结束位置之后。此外,您还没有返回 myArray 中实际填充数据的元素数,因此您的 main 函数可能会访问未初始化的元素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接