如何正确格式化 atoi 函数?

Posted

技术标签:

【中文标题】如何正确格式化 atoi 函数?【英文标题】:How does one correctly format the atoi function? 【发布时间】:2020-12-11 18:32:28 【问题描述】:

我正在尝试熟悉 atoi 函数,因此我使用它编写了一个基本程序,但我遇到了一些问题:

#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>

int main(void)

    string s = get_string("String:");
    int i = get_int("Integer:");
    int a = atoi(s[1]);
    int j = i + a;
    
    printf("%i\n", j);

当我尝试编译它时,我收到错误消息"incompatible integer to pointer conversion passing 'char' to parameter of type 'const char *'; take the address with &amp; [-Werror,-Wint-conversion]"。这似乎表明它想要与char 相关,但从我读到的内容来看,我的印象是 atoi 与字符串一起使用。如果有人能解释我哪里出错了,我会非常感激

【问题讨论】:

试试atoi(s);。提示:研究 strtol() 以获得比缺乏错误处理的 atoi() 更好的代码。 不确定string s是什么,如果stringchar*,那么你的atoi函数应该被称为atoi(s) 我怀疑&lt;cs50.h&gt; 隐藏了typedef char * string 等。虽然是出于好意,但我认为它会造成这样的混乱。 BlueKhakis,我建议编码char *s = get_string("String:"); 嗨@chux-ReinstateMonica,我将第 7 行替换为您建议的行,但仍然收到相同的错误消息。知道为什么吗? @BlueKhakis 是的,还需要应用以下答案。 【参考方案1】:

您通过索引字符串传递char(假设字符串是char* 的typedef),它希望您传递char*。所以只需传递完整的字符串:

#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>

int main(void)

    string s = get_string("String:");
    int i = get_int("Integer:");
    int a = atoi(s);
    int j = i + a;
    
    printf("%i\n", j);

【讨论】:

【参考方案2】:

这是atoi()的语法

int atoi(const char *nptr);

注意参数是一个指针,而不是单个字符。

但是,发布的代码有:

int a = atoi(s[1]);

是单个字符,不是指针

建议:

int a = atoi( s );

此外,函数:atoi() 无法让程序知道何时发生错误。建议使用strtol() 函数,该函数具有指示何时发生错误的功能

【讨论】:

以上是关于如何正确格式化 atoi 函数?的主要内容,如果未能解决你的问题,请参考以下文章

编译时间文本到数字转换 (atoi)

第五空间pwn5

机械硬盘提示函数不正确,要如何找到数据

如何在 asp.net 核心中正确格式化堆栈跟踪信息

C:如何将字符串转换为长整数格式的整数

如何在 TSQL 函数中检查正确的日期时间格式?