2010-01-28 3 views
0

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

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

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

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

 
12 
34 

, но по какой-то причине я получаю что-то вдоль этих линий.

 
12 
3412 

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

#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; 
} 

ответ

8

Вы забыли прекратить свои char буферов с нуля.

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

Должно быть

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

hourbuf[2] = '\0'; 
minbufer[2] = '\0'; 
11

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

+1

+1, потому что вы дали хорошее объяснение странного «3412» выхода. –

+0

мой мозг рассказывал мне об этом, но я не мог понять, как остановить это, что заставило меня с ума сойти. я пришел из фона программирования, где не было «нулевого завершения», поэтому я продолжаю забывать об этом .... :) спасибо за ответ. – Kristiaan

-1

Вы забыли обнулить прекратить:

minbufer[2] = '\0' 
+0

Ваша идея правильная, поэтому я не занимаюсь ниспровержением. Тем не менее, я подозреваю, что у вас есть понижение, потому что вы не указали, что у minbufer должно быть 3 символа. – GreenMatt

+0

Я это рассматривал, но я решил, что кодер REALLY должен уметь работать сам. –

+0

ваш правильный, как и Алекс :) ​​Я бы сработал, что один из них, proberbly не так быстро, как вы, ребята, но это бы ударило меня. этот язык является реальной кривой обучения для меня :) приветствия для ответа. – Kristiaan

1

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

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

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

char hourbuf[3]; 
int hour; 
... 
hourbuf[0] = filebuf[0]; 
hourbuf[1] = filebuf[1]; 
hourbuf[2] = '\0'; 
hour = atoi(hourbuf); 
Смежные вопросы