0

テキストファイル(時間)からデータを読み込もうとしています。それを現在のシステム時刻にDiffTimeできるものに変換します。

私はこれを正しく機能させることに非常に近づいており、味わうことはできますが、解決できない問題に悩まされています。(私はC言語の非常に基本的な知識を持っています)。

このプログラムは、テキストファイルからデータを読み込み、それを2つのchar配列に分割してatoiから、これを使用して整数に変換しようとします。ただし、2回目のatoi呼び出しで問題が発生します。

下の2つのprintfステートメントから、次のようになります。

12  
34

しかし、何らかの理由で私はこれらの線に沿って何かを得ています。

12  
3412

いずれかのchar配列の境界を超えてatoiいるか、char配列が長すぎるか短すぎると思います。いずれにせよ、私は何が起こっているのか理解できません。

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define COPYMODE 0644

int main (int argc, char *argv[]){
    int  i, nRead, fd;

    int  source;
    int  ihour;
    int  imin;

    int  STATE_OK = 0;
    int  STATE_WARNING  = 1;
    int  STATE_CRITICAL = 2;
    int  STATE_UNKNOWN  = 3;
    /* indicates if system is paused 1 = System is paused, 0 = System running */
    int  system_paused  = 0; 

    char filebuf[5]; 
    char hourbuf[2];
    char minbufer[2];

    if((fd = open(argv[1], O_RDONLY)) == -1)
    {
        printf("failed open : %s", argv[1]);
    }
    else
    {
        nRead = read(fd, filebuf, 5);
    }
    close(source);

    printf("filebuffer %s\n", filebuf);

    hourbuf[0] = filebuf[0];
    hourbuf[1] = filebuf[1];

    printf("Hour Buffer %c%c\n", hourbuf[0],hourbuf[1]);

    minbufer[0] = filebuf[2];
    minbufer[1] = filebuf[3];

    printf("Min Buffer %c%c\n", minbufer[0],minbufer[1]);

    imin = atoi(minbufer);
    ihour = atoi(hourbuf);


    printf("hour as int %d\n", ihour);
    printf("min as int %d\n", imin);

    return 0;
}
4

4 に答える 4

10

文字列をnullで終了する必要があります。hourbufとminbufer1を長くし、atoiを呼び出す前に最後に0を付けます。2つのバッファーはスタック上で隣接しているため、minbuferの読み取りもhourbufにスキャンされます。

于 2010-01-28T14:39:59.610 に答える
8

charバッファをゼロで終了するのを忘れました。

char hourbuf[2];
char minbufer[2];

する必要があります

char hourbuf[3];
char minbufer[3];

hourbuf[2] = '\0';
minbufer[2] = '\0';
于 2010-01-28T14:40:32.773 に答える
1

atoi引数がCスタイルの文字列であると想定します。つまり、末尾にヌル文字が含まれている必要があります。

あなたの手作りの疑似文字列はこれを保証しません。

解決策は、それらを拡大し、最後の要素を'\0次のように設定することです。

char hourbuf[3];
int hour;
...
hourbuf[0] = filebuf[0];
hourbuf[1] = filebuf[1];
hourbuf[2] = '\0';
hour = atoi(hourbuf);
于 2010-01-28T14:41:51.193 に答える
-1

null終了を忘れました:

minbufer[2] = '\0'
于 2010-01-28T14:40:25.383 に答える