2010-01-22 2 views
4

Нужен совет по этому вопросу, так как я боюсь abit и не могу понять это.Convert Linux C Char Array to Int

У меня есть файл, который обновляется на ПК, чтобы указать, что система работает и в какое время она запускается. Я пишу очень простое консольное приложение Linux (в конечном итоге это будет плагин nagios). который читает этот файл и отвечает в зависимости от того, что он нашел в файле.

Я новичок в программировании на Linux и с использованием C, поэтому, пожалуйста, будьте терпеливы, и если вы объясните все ответы, это будет действительно оценено.

В основном я хочу преобразовать массив символов, содержащий 5 символов, в целое число, однако 5-й символ в массиве всегда является буквой. поэтому технически все, что я хочу сделать, - это преобразовать первые 4 символа в массив в целое число ... как? ive попробовал несколько способов без успеха, моя проблема в том, что в настоящее время у меня нет хорошего понимания языка, поэтому у меня нет реальных идей о том, что он может и чего не может сделать.

вот источник моей программы.

в основном массив ЬиЕ будет держать строку, взятую из файла, который будет выглядеть примерно так

3455Y (число будет случайным, но долго всегда 4 символов).

Извините за плохое форматирование кода, но я не могу получить это глупое окно для любви, ни денег, чтобы правильно отформатировать его ....

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 STATE_OK = 0; 
    int STATE_WARNING = 1; 
    int STATE_CRITICAL = 2; 
    int STATE_UNKNOWN = 3; 
    int system_paused = 0; 

    char buf[5]; 
    int testnumber; 

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

    close(source); 

    if (buf[4] == 'P') 
    { 
     printf("Software Paused"); 
     return STATE_WARNING; 
    } 
     else 
    { 
     return STATE_OK; 
    } 
    time_t ltime; /* calendar time */ 
    struct tm *Tm; 
    ltime=time(NULL); /* get current cal time */ 
    Tm=localtime(&ltime); 


    int test; 
    test = Tm->tm_hour + Tm->tm_min; 
    printf("%d", test); 

    printf("%d", strtoi(buf)); 

} 
+0

Чтобы отформатировать код, используйте кнопку «10101» в верхней части окна, в котором вы вводите свой вопрос в –

+0

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

ответ

3

Вы можете использовать atoi

atoi требуется один символ * аргумент и возвращает Int. Если строка пуста, или первый символ не является числом или знак минуса, то atoi возвращает 0.If atoi встречает без номера символа, он возвращает число не сформированное до этого момента

int num = atoi(buf); 
+0

хотя atoi имеет некоторые проблемы, о которых говорили выше, я действительно нуждаюсь только в очень простой цели: конвертировать первые 4 символа строки в INT, поэтому я выбираю это как ответ, поскольку он работает очень хорошо , спасибо всем, кто разместил решение этой проблемы. – Kristiaan

+0

Почему бы не strtol, strtoul, strtoll или strtoull? Они имеют намного лучшую проверку ошибок. –

6

Вы можете использовать sscanf, чтобы сделать работу:

int num = 0; 
sscanf(buf, "%4d", &num); 

Затем num должен содержать номер из строки в файле.

1

если вы хотите, чтобы преобразовать первые четыре символа строки в целое число сделать это:

#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 
#include <stdint.h> 

uint8_t convertFirstFourChars(char * str, uint32_t *value){ 
    char tmp[5] = {0}; 
    strncpy((char *) tmp, str, 4); 
    *value = strtoul(tmp); 
    return errno; 
} 

затем вызвать/протестировать эту функцию, как этот

#include <stdint.h> 
#include <stdio.h> 

int main(int argc, char **argv){ 

    char test1[5] = "1234A"; 
    char test2[5] = "ABCDE"; 

    uint32_t val = 0; 
    if(convertFirstFourChars((char *) test1, &val) == 0){ 
    printf("conversion of %s succeeded, value = %ld\n", test1, val); 
    } 
    else{ 
    printf("conversion of %s failed!\n", test1); 
    } 

    if(convertFirstFourChars((char *) test2, &val) == 0){ 
    printf("conversion succeeded of %s, value = %ld\n", test2, val); 
    } 
    else{ 
    printf("conversion of %s failed!\n", test2); 
    } 

    return 0; 
} 

FWIW, не используйте atoi(...), потому что он преобразует любую строку в целое число независимо от ее действительности в виде числа. atoi("foo") === 0.

0

это как большая часть вашего кода, как я был в состоянии оправиться от форматирования:

#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <time.h>

#define COPYMODE 0644

int main(int argc, char *argv[]) { int i, nRead, fd; int source; int STATE_OK = 0; int STATE_WARNING = 1; int STATE_CRITICAL = 2; int STATE_UNKNOWN = 3; int system_paused = 0;

char buf[5]; int testnumber;

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

if (buf[4] == 'P') { printf("Software Paused"); return STATE_WARNING; } else { return STATE_OK; } time_t ltime; /* calendar time / struct tm Tm; ltime=time(NULL); / get current cal time */ Tm=localtime(&ltime);

int test; test = Tm->tm_hour + Tm->tm_min; printf("%d", test); printf("%d", strtoi(buf)); }

это версия, которая делает то, что вы указали:

#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <time.h>

#define COPYMODE 0644

int main(int argc, char *argv[]) { int i, nRead, fd; int source; int STATE_OK = 0; int STATE_WARNING = 1; int STATE_CRITICAL = 2; int STATE_UNKNOWN = 3; int system_paused = 0;

char buf[5]; int testnumber;

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

if (buf[4] == 'P') { printf("Software Paused"); return STATE_WARNING; }/* else { return STATE_OK; buf[4] = 0; } */ time_t ltime; /* calendar time */ struct tm *Tm; ltime=time(NULL); /* get current cal time */ Tm=localtime(&ltime);

int test; test = Tm->tm_hour + Tm->tm_min; printf("%d\n", test); printf("%d\n", atoi(buf)); }

Самая большая проблема с ваш код был оператором if с возвращаемыми значениями в каждой ветви, гарантируя, что после выполнения оператора if ничего не выполнялось.

+0

привет Юстину, спасибо, что указал на результаты в заявлении IF, хотя я знал о них, мой разум, казалось, затушил этот факт .., который объяснил бы, почему ни один из приведенных ниже кодов не работает ... спасибо за обнаружение это. – Kristiaan