gpt4 book ai didi

c - 使用 strtok_r 时出现段错误

转载 作者:行者123 更新时间:2023-11-30 18:54:08 28 4
gpt4 key购买 nike

我想用以下代码在c中分割一个字符串:

char *search = "+" ;
char *temp1;
char *temp2;
char *saveptr1, *saveptr2 ;
int operand1 ;
int operand2 ;
int result ;
char sumBuff [5][25]
temp1 = strtok_r(sumBuff[sumCounter-1], search, &saveptr1) ;
operand2 = atoi(strtok_r(NULL, search, &saveptr1));
temp2 = strtok_r(temp1, ".", &saveptr2) ;
operand1 = atoi(strtok_r(NULL, ".", &saveptr2)) ;

但是当我在主代码中运行它时,我遇到了段错误。这是跟踪堆栈结果:

#0  0x00007ffff7834517 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1 0x00007ffff7830f60 in atoi () from /lib/x86_64-linux-gnu/libc.so.6
#2 0x000000000040108c in plusExec (arg=0x0) at cm.c:112
#3 0x00007ffff7bc4182 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#4 0x00007ffff78f147d in clone () from /lib/x86_64-linux-gnu/libc.so.6

cm.112operand2 = atoi(...)我该如何纠正这个错误?

最佳答案

您不检查 strtok_r 的返回,它可能为 NULL,因此导致 atoi 崩溃。

在这种情况下:

temp2 = strtok_r(temp1, ".", &saveptr2) ;
operand1 = atoi(strtok_r(NULL, ".", &saveptr2)) ;

...您似乎正在寻找两个连续的点?比如5.123.723?如果只有一个,atoi 将收到 NULL 和 coredump。

如果不应该有两个连续的“.”,那么这可能是一个错误。

假设不是,请尝试:

temp2 = strtok_r(temp1, ".", &saveptr2); // E.g. 5

// If there is no other token, operand1 is set to zero.
operand1 = 0;
if (temp2 != NULL) {
char *temp3;
temp3 = strtok_r(NULL, ".", &saveptr2); // E.g. 123, or NULL
if (temp3 != NULL) {
operand1 = atoi(temp3);
}
}

(第一个 atoi 的方法相同)。

根据数据格式,您可能会使用一个解析器函数来返回整数数组及其基数;再次,如果您需要处理可变点数量,例如 192.168.1.1 或 1.2.7.0.80.17 - 否则您不必费心:

/**
* Parses a string in the format 1.2343.293.777
* @param char * inputString Input string
* @param int * vect Vector where to store integers
* @param size_t n Maximum vector size
* @return size_t Number of integers returned
*/

size_t parseDottedIntegers(char *inputString, int *vect, size_t n) {
size_t i = 0;
char *p;
char *save = NULL;
p = strtok_r(inputString, ".", &save);
while (i < n) {
vect[i++] = atoi(p);
p = strtok_r(NULL, ".", &save);
if (NULL == p) {
return i;
}
}
// Error (e.g. too many parts)
return 0;
}

关于c - 使用 strtok_r 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30925694/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com