Почему Атои возвращает случайные числа? - PullRequest
0 голосов
/ 28 января 2010

Я пытаюсь прочитать данные из текстового файла (время). и преобразовать это во что-то, что может быть DiffTime'ed к текущему системному времени.

Я сейчас так близок к тому, чтобы заставить это работать правильно, я могу попробовать это, но я застрял с проблемой, которую я не могу решить. (У меня есть базовые знания языка Си).

эта программа считывает данные из текстового файла, разбивает их на два массива символов и затем пытается использовать atoi для преобразования их в целое число. Однако у меня проблемы со вторым atoi звонком.

Из двух нижних printf заявлений я должен получить:

12  
34

но по какой-то причине я получаю что-то подобное.

12  
3412

Я предполагаю, что atoi выходит за границы одного из массивов символов, или мои массивы символов слишком длинные или слишком короткие. В любом случае, я не могу понять, что происходит.

#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 ]

10 голосов
/ 28 января 2010

Вам нужно завершить строки нулем. Увеличьте время часа и минбуфера на 1 и поставьте 0 в конце перед вызовом atoi. Два буфера находятся рядом в стеке, поэтому чтение minbufer сканирует также в hourbuf. * ​​1001 *

8 голосов
/ 28 января 2010

Вы забыли завершить свои буферы char нулем.

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

Должно быть

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

hourbuf[2] = '\0';
minbufer[2] = '\0';
1 голос
/ 28 января 2010

atoi предполагает, что его аргумент является строкой в ​​стиле C, что означает, что он должен содержать завершающий нулевой символ.

Ваши псевдостроки ручной работы не гарантируют этого.

Решением будет увеличение их и установка последнего элемента на '\0:

char hourbuf[3];
int hour;
...
hourbuf[0] = filebuf[0];
hourbuf[1] = filebuf[1];
hourbuf[2] = '\0';
hour = atoi(hourbuf);
0 голосов
/ 28 января 2010

Вы забыли завершить ноль:

minbufer[2] = '\0'
...