我想编写一个程序,将数字(“ 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;
}
答案 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
函数可能会访问未初始化的元素。