gpt4 book ai didi

c - 解析以逗号分隔的字符串只能工作一次?

转载 作者:太空宇宙 更新时间:2023-11-04 00:39:01 25 4
gpt4 key购买 nike

当我按“A”时,我有一个菜单我执行以下代码来解析以逗号分隔的数字。我第一次按“A”时结果是 100% 准确的。但是第二次以上我从菜单中按“A”重复相同的代码时,我得到了奇怪的结果。我正在使用带有 PIC18 的 MPLAB C18 编译器

我正在使用带有 PIC18 的 MPLAB C18 编译器

第一次输出

0002

0100

0200

0100

第二次+输出

0002

代码

char somestr[] ="2,0100,0200,0100";
char *pt;
int a;
pt = strtokpgmram (somestr,",");

while (pt != NULL)
{
a = atoi(pt);
printf("%d\n", a);
pt = strtokpgmram (NULL, ",");
}

如何修复它,以便每次从菜单中按“A”时,我都能得到与第一次输出相同的结果?

谢谢!

最佳答案

这是因为,调用 strtok() 会改变原始字符串本身。在调用 strtok() 之前,您必须复制原始字符串。

我专门制作了一个示例程序供您理解。

看,它在 tokenize 函数中,每次我制作副本并使用副本时。

#include<stdio.h>
#include<string.h>

void tokenize(char* s){

char *pt;
int a;

char* copy_somestr = malloc((strlen(s)+1) * sizeof(char));
strcpy(copy_somestr,s);

pt = strtok (copy_somestr,",");

while (pt != NULL)
{
a = atoi(pt);
printf("a = %d somestr = %s\n", a,s);
pt = strtok (NULL, ",");
}

free(copy_somestr);
}
void main(){
char somestr[] ="2,0100,0200,0100";

/*
printf("Beginning somestr = %s",somestr);
// If you tokenize here without making any copy using somestr, It still works well But after this call somestr will become unusable.
printf("Afterlast somestr = %s",somestr);
*/


tokenize(somestr);

// You could still use somestr
printf("I could still use somestr = %s\n",somestr);


tokenize(somestr);

}

关于c - 解析以逗号分隔的字符串只能工作一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16345707/

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