比较C中ASCII字符串的数值

比较C中ASCII字符串的数值,c,floating-point,ascii,atof,C,Floating Point,Ascii,Atof,我正在将两个ASCII字符数组完美地写入LCD屏幕。但是我需要一个if条件来比较这两个值 最初,我试图简单地将它们进行如下比较: if(currentTemp < triggTemp) { alarmTriggered = true; } 本质上,我试图比较这些ASCII字符的字符数组,以便使用if条件触发报警 我尽量使代码片段简短,我可以根据要求澄清。谢谢你的帮助 编辑:我知道我正在将atof用于double变量;我的库中的原型就是这样设置的。我想这就是您正在做的: char*

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

最初,我试图简单地将它们进行如下比较:

if(currentTemp < triggTemp)
{
   alarmTriggered = true;
} 
本质上,我试图比较这些ASCII字符的字符数组,以便使用if条件触发报警

我尽量使代码片段简短,我可以根据要求澄清。谢谢你的帮助


编辑:我知道我正在将
atof
用于
double
变量;我的库中的原型就是这样设置的。

我想这就是您正在做的:

char* some_function() {
  char temporary_string_buffer[32]; // Or some other fixed size
  snprintf(temporary_string_buffer, 32, "some format");
  return temporary_string_buffer;
}
你不能那样做。好的,您可以这样做--您可能刚刚这样做了--但它有未定义的行为,因为
临时字符串缓冲区的生存期以
return
语句结束。在调用者中,函数将返回俗称的“悬空指针”;换句话说,一个指针,其目标不再有任何意义。因此,当您开始对该值调用
atof
时,它可能已被用于完全不同的用途

如果要向调用者返回字符串,请执行以下任一操作:

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

  • 让调用者为您提供缓冲区的地址及其长度(作为参数),并填写提供的缓冲区。您可以将返回代码用作成功指示器,或(如sprintf)用作字节计数,或其他任何形式


字符当前温度。。。atof(电流温度)将不起作用
double-atof(const-char*nptr)
需要指向字符串的指针,而不是
char

创建一个函数来为您进行比较。这是一个完整的测试程序。只需逐个比较数组元素

int is_greater(char a[], char b[], int z, int z1) {
    int i = 0;
    for( i = 0; i < z; i++ ) {
        if( a[i] > b[i] ) return 1;
    }
    return 0;
}
int更大(字符a[],字符b[],整数z,整数z1){
int i=0;
对于(i=0;ib[i])返回1;
}
返回0;
}

能否显示
get_temp()
的函数声明?它返回什么类型?为什么要通过传递
itoa
进行卷积,为什么不将
sprintf
%d.%u
格式一起使用?您已经声明
currentTemp
为单个字符,而不是字符数组。@JohnColeman对于
triggTemp
也是相同的,它也没有初始化。在“编写两个ASCII字符数组”中,一个的结束和下一个的开始有什么区别<代码>'\n'
?我理解你的意思,但有点困惑,为什么在这种情况下,我可以使用返回的字符像这样将ASCII字符串打印到我的LCD上。当然,如果缓冲区的寿命以return语句结束,我就不能打印准确的LCD值了?@James:Undefined行为就是Undefined。也许它做了一件事,也许它做了另一件事。巧合的是,它做了一些你认为是准确的事情,这并不意味着下次你犯同样的错误时,你就不会犯segfault或更糟的错误。换句话说,有了C,你应该知道你不能做什么。如果您仍然这样做,C编译器没有义务告诉您不应该这样做。未定义的行为不是错误消息。它只是简单的未定义。我理解这意味着在这种情况下,指针没有被用于任何不同的用途,但这是偶然的。该值可能在任何时候被覆盖。我正在考虑用你的建议来纠正这个错误。对第一种选择有进一步的澄清吗?从来没有用过malloc之类的method@james:第二种方法可能更常见。我现在有点困惑,我认为从函数返回一个值只是给了我一个变量。此处显示:currentTemp=get_temp();根据我的编码经验,我的印象是currentTemp变量现在保存着函数返回的值?您需要传递这两个变量的长度,或者如果您知道它们的长度相同,您可以像我在这里所做的那样。我不想比较两个字符数组的长度。我试图比较每个数组表示的数字的数值。一个数组保留小数点后1位的浮点,另一个数组保留5.5位。我误解了你的意图。解决方案几乎相同。如果比较数组中的每个字符,任何大于的字符都表示该数字更大。这确实是一个函数,我最终可能会使用它的一种表现形式(非常感谢!),但真正需要说明的问题是,我使用的是指向可能在内存中被覆盖的变量的悬空指针。我的印象是,通过从函数返回一个值,我可以使用该变量。但事实似乎并非如此
char* some_function() {
  char temporary_string_buffer[32]; // Or some other fixed size
  snprintf(temporary_string_buffer, 32, "some format");
  return temporary_string_buffer;
}
int is_greater(char a[], char b[], int z, int z1) {
    int i = 0;
    for( i = 0; i < z; i++ ) {
        if( a[i] > b[i] ) return 1;
    }
    return 0;
}