0

このプログラムでは、char *token が奇妙なガベージ値で初期化されています。整理できません。ソースコードは次のとおりです。

#include<iostream>
#include<string.h>
#include<stdlib.h>

void fetch_value(char *string,int pos,char *dest)
{
    char *token;
    int i=0;
    token=strtok(string,",");
    if(pos>1)
    {
        token=strtok(NULL,",");
        while(i<pos-1){
            token=strtok(NULL,",");
            printf("token =%s\n",token);
            i++;
        }
        strcpy(dest,token);
    }
    else
    {
        strcpy(dest,token);
    }
}

int main(void)
{
    char checking[100];
    memset(checking,0x00,sizeof(checking));
    fetch_value("14174000100,35679700322,35679700322,35679700322,
            35679700322,14174000999,919440710210000,1",0,checking);
    printf("checking=%s\n",checking);
    return 0;
}

あなたの助け、フィードバック、または提案は大歓迎です。

4

2 に答える 2

3

の最初の引数はstrtok変更可能でなければなりません。コードは、変更できない文字列リテラルを渡します。これにより、未定義の動作が発生します。

問題を解決する最も簡単な変更は次のとおりです。

char numList[] = "14174000100,35679700322,35679700322,35679700322,35679700322,14174000999,919440710210000,1";
fetch_value(numList, 0, checking);

strtokは、静的変数を使用して状態を保存するため、再入可能ではない古い関数であることに注意してください。strtok_r新しいコードでは、状態を保存するためにメモリを渡す必要がある関数 - の再入可能バージョンを使用する必要があります。

于 2013-03-30T13:38:58.540 に答える
1

代わりにこれを行います:

 int main(void)
   {
     char checking[100];
     memset(checking,0x00,sizeof(checking));
     char string[] = "14174000100,35679700322,35679700322,35679700322,
     35679700322,14174000999,919440710210000,1";
     //now string can be modified.
     fetch_value(&string[0],0,checking);
     printf("checking=%s\n",checking);
     return 0;
    }
于 2013-03-30T13:40:24.177 に答える