1

当我按下“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”时,我都会得到与第一次输出相同的结果?

谢谢!

4

1 回答 1

7

这是因为,调用 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);  

}
于 2013-05-02T19:05:09.870 回答