为什么在 Mac 和 Ubuntu 中使用 strtok_r 的结果不同
Why is different result using strtok_r in Mac & Ubuntu
我在练习c语言strtok_r().
这是我的代码。
#include<stdio.h>
#include<string.h>
#include<unistd.h>
int main(int argc, char** argv){
char* ptr = NULL;
char* next[2] = {0};
char delimiter[4];
int now = 1;
strcpy(delimiter, " \t");
// check argc number
if(argc != 3){
printf("usage : ./test {string} {string}\n");
return -1;
}
ptr = strtok_r(argv[1], delimiter, &next[1]);
printf("ptr : %s, next : %s\n", ptr, next[1]);
ptr = strtok_r(argv[2], delimiter, &next[2]);
while((ptr = strtok_r(NULL, delimiter, &next[1])) != NULL){
printf("%d : %s, next : %s\n", ++now, ptr, next[1]);
}
return 0;
}
我认为代码结果会是
$ a.out "I'm test now" "Hello every"
ptr : i'm, next : test now
2 : test, next : now
3 : now, next : (null)
我的 mac 结果是这样。
但我的 ubuntu20.04(Docker 图片)不是。
这是在 Ubuntu.
上执行的结果
$ a.out "i'm test now" "hello every"
ptr : i'm, next : test now
2 : test now, next :
为什么 Mac 和 ubuntu
的结果不同
关于:
char* next[2] = {0};
...
ptr = strtok_r(argv[1], delimiter, &next[1]);
printf("ptr : %s, next : %s\n", ptr, next[1]);
ptr = strtok_r(argv[2], delimiter, &next[2]);
while((ptr = strtok_r(NULL, delimiter, &next[1])) != NULL){
数组:next
有 2 个元素。因此,该数组的有效索引是 0 和 1。不是 1 和 2。
发布的代码正在访问 next
数组的末尾。结果是未定义的行为。
注意:数组的有效索引为 0...(数组中的元素数 -1)
我在练习c语言strtok_r().
这是我的代码。
#include<stdio.h>
#include<string.h>
#include<unistd.h>
int main(int argc, char** argv){
char* ptr = NULL;
char* next[2] = {0};
char delimiter[4];
int now = 1;
strcpy(delimiter, " \t");
// check argc number
if(argc != 3){
printf("usage : ./test {string} {string}\n");
return -1;
}
ptr = strtok_r(argv[1], delimiter, &next[1]);
printf("ptr : %s, next : %s\n", ptr, next[1]);
ptr = strtok_r(argv[2], delimiter, &next[2]);
while((ptr = strtok_r(NULL, delimiter, &next[1])) != NULL){
printf("%d : %s, next : %s\n", ++now, ptr, next[1]);
}
return 0;
}
我认为代码结果会是
$ a.out "I'm test now" "Hello every"
ptr : i'm, next : test now
2 : test, next : now
3 : now, next : (null)
我的 mac 结果是这样。
但我的 ubuntu20.04(Docker 图片)不是。
这是在 Ubuntu.
$ a.out "i'm test now" "hello every"
ptr : i'm, next : test now
2 : test now, next :
为什么 Mac 和 ubuntu
的结果不同关于:
char* next[2] = {0};
...
ptr = strtok_r(argv[1], delimiter, &next[1]);
printf("ptr : %s, next : %s\n", ptr, next[1]);
ptr = strtok_r(argv[2], delimiter, &next[2]);
while((ptr = strtok_r(NULL, delimiter, &next[1])) != NULL){
数组:next
有 2 个元素。因此,该数组的有效索引是 0 和 1。不是 1 和 2。
发布的代码正在访问 next
数组的末尾。结果是未定义的行为。
注意:数组的有效索引为 0...(数组中的元素数 -1)