-1

昨日の夕方からatoi関数のこの問題に苦労していますが、逃げられません。私は次の 2 つの機能を持つプログラムを作成しました。OS が更新されてからの日数。2-番号を見つけます。ウイルス対策が更新されてからの日数。多くのループの後、mm/dd/yy 形式の 2 つの日付を見つけ、ファイルに書き込みました。現在、ウイルス対策の日付 (16 進値を 10 進値に変換した後に取得したもの) のみに取り組んでおり、それを新しいファイルに保存しています。たとえば、日付を 07/17/2013 とします。この日付だけがファイルに書き込まれます。ファイル内の 16 進データ (16 進ワークショップでファイルを開いた後) は次のとおりです。

    HEX VALUE --------------------------DECIMAL VALUE
    37 2F 31 37 2F 32 30 31 33 0D 0A --- 7/17/2013..

ここで、3 つのループを実行して、別々の char 変数で 7、17、2013 を取得します。しかし、atoi を使用してこれらを 10 進数に変換すると、7 と 17 は 0 になりますが、2013 は 2013 のままです。90% のプロジェクトの残りを完了し、この最後の部分で立ち往生しました。プログラム全体をドメイン マシンに実装する必要があるため、ファイルの文字エンコーディングを変更できません。また、UTF を操作する方法が見つかりません。個々の日、月、年を整数値に変換した後、日付のtoatl値を見つけて現在の日付と比較し、違いを見つける必要があります。だから、plzはいくつかの解決策を提供します。

int main(void)
{
    FILE *fp_av_dt;
    int ch_av,n=0,n1=0,n2=0,i=0,iday1=0,imon1=0,iyr1=0;
    int mon_val1=0,arr_days_values_av=0;   
    char dt_av[11],amon1[3],aday1[3],ayr1[5];

    fp_av_dt=fopen("c:\\windows\\web\\wallpaper\\av_dt.txt","r");

    while((ch_av=fgetc(fp_av_dt))!='\n')
    {
        if(isalnum(ch_av) | ch_av=='/' | ch_av=='\n')
        /* leave any other char other than '/','\n' or any digit */
        {
            dt_av[n]=ch_av;
            //printf("%c",dt_av[n]); 
            //store chars in dt_av array
            n++;
        }
    }

    printf("\n");

    for(n=0;dt_av[n]!='/';n++)       /* Loop & wait till '/' comes */
    {
        amon1[i]=dt_av[n];     /* store elements in month's array */   
        //printf("%c",amon1[i]);
        i++;     
    }

    i=0;

    for(n1=(n+1);dt_av[n1]!='/';n1++)   /*Loop & wait till next '/' comes */
    {
        aday1[i]=dt_av[n1];   store elements in day's array */
        //printf("%c",aday1[i]);
        i++;    
    }

    i=0;

    for(n2=(n1+1);dt_av[n2]!='\n';n2++)
    {
        ayr1[i]=dt_av[n2];    store elements in year's array */
        //printf("%c",ayr1[i]);
        i++;     
    }

    i=0;

    iday1=atoi(aday1);        /* convert array to integer */       
    printf("%d\n",iday1);

    imon1=atoi(amon1);                   
    printf("%d\n",imon1);  

    iyr1=atoi(ayr1);                     
    printf("%d\n",iyr1);

    system("PAUSE");
}   /* Uncomment printf lines to see the value of any variable */

ここで就寝時間です。10時間後にオンラインになります。ありがとう...

4

4 に答える 4

1

「不規則に動作する」理由は、charどの配列も NUL で終了していないためです。変化:

i=0;

に:

amon[i] = '\0'; i = 0;

などはそれを修正する必要がありますが、境界チェックはまだありません。

于 2013-09-01T18:39:31.993 に答える
1

forループを次のように置き換えてみてください

fscanf(fp_av_dt, "%d/%d/%d", &iday1, &imon1, &iyr1);

戻り値は 3 で、3 つの値が読み取られたことを示します。

cf scanf(3)

于 2013-09-01T18:23:36.503 に答える
0

解決策を提供し、scanf コマンドをいくつか提供していただきありがとうございます。私は抜け道を見つけました。それは非常に奇妙ですが、うまくいきました。割り当てを終えた直後に各char変数の値を整数に変換すると、正しい値が得られます。これまで、すべての変数をまとめて変換(atoi)していました(つまり、すべての配列に要素を格納した後)。解決策の例:

    for(n=0;dt_av[n]!='/';n++)     /* wait till '/' comes */
    {
        amon1[i]=dt_av[n]; //assign 7 to amon (month) variable                    
        i++;     
    }  
    amon1[i+1]='\0'; /* didn't actually make any difference, but still it should be kepy */
    i=0;   imon1=atoi(amon1);
    printf("%d\n",imon1);

なぜこれが起こっているのか理解できず、過去 24 時間ずっと頭を悩ませていました。とにかく、みんなに感謝します。

于 2013-09-01T19:03:22.577 に答える