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