当我按下"A"时,我有一个菜单,我执行以下代码,解析用逗号分隔的数字.我第一次按'A'时结果是100%准确的.但第二次+次我从菜单中按'A'重复相同的代码,我得到奇怪的结果.我正在使用带有PIC18的MPLAB C18编译器
我正在使用带有PIC18的MPLAB C18编译器
首次输出
技术
0100
0200
0100
第二次+时间输出
技术
码
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, ",");
}
Run Code Online (Sandbox Code Playgroud)
你如何解决它,以便每次我从菜单中按'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);
}
Run Code Online (Sandbox Code Playgroud)