在 C 中比较 ASCII 字符串的数值

标签 c floating-point ascii atof

我正在将两个 ASCII 字符数组完美地写入 LCD 屏幕。但是我需要一个 if 条件来比较这两个值。

最初我试图像这样简单地比较它们:

if(currentTemp < triggTemp)
{
   alarmTriggered = true;
} 

由于这不起作用,我尝试使用 atof() 将它们从 ASCII 字符串转换为 float 。

但是这似乎也不起作用,我在这里错过了一些愚蠢的事情吗?必要的代码如下:

void main () {

    char triggTemp;
    int buttonBool = 0;
    bool alarmTriggered = false;
    char currentTemp;
    double f_triggTemp = 0;
    double f_currentTemp = 0;


  TRISC = 0x00;
  init();
  Init_lcd();



  while(1) 
  {
      //char bufferString[4];
      currentTemp = get_temp();

      f_currentTemp = atof(currentTemp);
      f_triggTemp = atof(triggTemp);

      if(f_currentTemp < f_triggTemp)
      {
          alarmTriggered = true;
      }



      if(alarmTriggered == true)
      {
          soundBuzzer();
      }
}

函数返回的值采用以下形式:

//some function
char bufferString[4];

sprintf(numberString, "%s.%s", itoa(bufferString,setTemp,10),
             itoa(bufferStringDec,setTempDec,10));

    return numberString;

本质上,我试图比较这些 ASCII 字符的 char 数组,以便我可以使用 if 条件来触发警报。

我试图保持代码片段简短,我可以根据要求进行澄清。感谢您的帮助。

编辑:我知道我正在使用 atofdouble 变量中;我的库中的原型(prototype)就是这样设置的。

最佳答案

我认为这就是你正在做的事情:

char* some_function() {
  char temporary_string_buffer[32]; // Or some other fixed size
  snprintf(temporary_string_buffer, 32, "some format");
  return temporary_string_buffer;
}

你不能这么做。好的,您可以这样做 - 您可能刚刚这样做 - 但它具有未定义的行为,因为 temporary_string_buffer 的生命周期以 return 语句结束。在调用者中,该函数将返回俗称的“悬空指针”;换句话说,其目标不再具有任何意义的指针。因此,当您开始对该值调用 atof 时,它可能已被用于完全不同的用途。

如果您想将字符串返回给调用者,可以:

  • 使用malloc动态分配字符串,并确保调用者知道他们需要释放它;或

  • 让调用者为您提供缓冲区的地址及其长度(作为参数),并填充提供的缓冲区。您可以使用返回码作为成功指示符,或者(如 sprintf)作为字节数,或者其他。

关于在 C 中比较 ASCII 字符串的数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34798063/

相关文章:

python:像整数一样的 float

c - 使用 IEEE float 表示的最大负实数

java - 要存储在数组中的字符的整数值

sql - 将每个字母替换为 PL/SQL 中字符串中的 ASCII 代码

c - 标准输入上最受欢迎的字符

c - 使用 ld 实用程序与 dlfcn API 进行动态链接的优点是什么?

创建带有调试选项的 makefile

c - 'target_tweet'的地址永远不会是NULL!?

c - 试图除以复数,除以零

c++ - C++ 如何将 int 舍入为 float/double?