将 Linux C 字符数组转换为整数

4

我在这方面需要一些建议,因为我有些困难,无法弄清楚。

我有一个文件,在PC上更新以指示系统运行和运行时间。我正在编写一个非常简单的Linux控制台应用程序(最终将成为nagios插件)。它读取此文件并根据在文件中找到的内容做出响应。

我是Linux编程和使用C的新手,请耐心等待,如果您能解释任何答案,那真的会很感激。

基本上,我想将包含5个字符的char数组转换为整数,但是数组中的第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));

}

要格式化代码,请使用您正在输入问题的窗口顶部的“10101”按钮。 - RC.
哈哈,我知道为什么无法格式化代码,答案很简单。谢谢 :) - Kristiaan
4个回答

6
您可以使用sscanf来完成此任务:
int num = 0;
sscanf(buf, "%4d", &num);

那么num应该保存文件中行中的数字。


2

您可以使用atoi函数

atoi函数需要一个char *类型的参数,并返回一个int类型。如果字符串为空,或者第一个字符不是数字或负号,则该函数返回0。如果遇到非数字字符,则会返回截止到该字符前的数字。

int num = atoi(buf);

尽管atoi存在一些人们上面提到的问题,但我只需要将字符串的前4个字符转换为INT这个非常简单的目的,所以我选择它作为答案,因为它运行得非常好。感谢其他所有发布解决方案的人。 - Kristiaan
为什么不使用strtol、strtoul、strtoll或strtoull呢?它们具有更好的错误检查。 - Joe D

2
如果你想将字符串的前四个字符转换成整数,可以这样做:
#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;
}

顺便说一句,不要使用 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;

如果((fd = open(argv[1], O_RDONLY)) == -1) { printf("打开失败: %s", argv[1]); return STATE_UNKNOWN; } else { nRead = read(fd, buf, 5); } close(source);

如果(buf [4] == 'P') { printf(“软件已暂停”); 返回STATE_WARNING; } else { 返回STATE_OK; } time_t ltime; / *日历时间* / 结构tm Tm; ltime = time(NULL); / *获取当前的日历时间* / Tm = localtime(&ltime);

int test; 测试= Tm-&gt; tm_hour + Tm-&gt; tm_min; printf(“%d”,test); printf(“%d”,strtoi(buf)); }

这是符合您要求的版本:

<代码><预处理器指令:unistd.h> #包括<sys / types.h> #包括<sys / stat.h> #包括<fcntl.h> #包括<stdio.h> #包括<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;

如果((fd = open(argv[1], O_RDONLY)) == -1) { printf("打开失败 : %s", argv[1]); return STATE_UNKNOWN; } else { nRead = read(fd, buf, 5); } close(source);

if (buf[4] == 'P') { printf("软件暂停"); return STATE_WARNING; }/* else { return STATE_OK; buf[4] = 0; } */ time_t ltime; /* 日历时间 */ struct tm *Tm; ltime=time(NULL); /* 获取当前日历时间 */ Tm=localtime(&ltime);

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

你的代码最大的问题是 if 语句中每个分支都有返回,确保 if 语句后面的任何内容都不会被执行。


嗨Justin,感谢你指出IF语句中的返回值问题,虽然我知道这个问题,但我的思维似乎忽略了这一点...这也可以解释为什么下面的代码都无法工作...感谢你发现这个问题。 - Kristiaan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接