Конвертировать массив Linux C Char в Int - PullRequest
4 голосов
/ 22 января 2010

нужен какой-то совет по этому вопросу, так как я борюсь с abit и не могу понять это.

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

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

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

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

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

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));

}

Ответы [ 4 ]

6 голосов
/ 22 января 2010

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

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

Тогда num должен содержать число из строки в файле.

2 голосов
/ 22 января 2010

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

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

2 голосов
/ 22 января 2010

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

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

int num = atoi(buf);
0 голосов
/ 22 января 2010

это ваш код, который я смог восстановить после форматирования: &#35;include <unistd.h> &#35;include <sys/types.h> &#35;include <sys/stat.h> &#35;include <fcntl.h> &#35;include <stdio.h> &#35;include <time.h></p> <p>&#35;define COPYMODE 0644</p> <p>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;</p> <p>char buf[5]; int testnumber;</p> <p>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);</p> <p>if (buf[4] == 'P') { printf("Software Paused"); return STATE_WARNING; } else { return STATE_OK; } time_t ltime; /* calendar time <em>/ struct tm Tm; ltime=time(NULL); /</em> get current cal time */ Tm=localtime(&ltime);</p> <p>int test; test = Tm->tm_hour + Tm->tm_min; printf("%d", test); printf("%d", strtoi(buf)); }

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

&#35;include <unistd.h> &#35;include <sys/types.h> &#35;include <sys/stat.h> &#35;include <fcntl.h> &#35;include <stdio.h> &#35;include <time.h></p> <p>&#35;define COPYMODE 0644</p> <p>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;</p> <p>char buf[5]; int testnumber;</p> <p>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);</p> <p>if (buf[4] == 'P') { printf("Software Paused"); return STATE_WARNING; }/&#42; else { return STATE_OK; buf[4] = 0; } &#42;/ time_t ltime; /&#42; calendar time &#42;/ struct tm &#42;Tm; ltime=time(NULL); /&#42; get current cal time &#42;/ Tm=localtime(&ltime);</p> <p>int test; test = Tm->tm_hour + Tm->tm_min; printf("%d\n", test); printf("%d\n", atoi(buf)); }

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

...