有人可以向我解释这实际上是如何工作的(atoi)

时间:2017-08-28 21:38:55

标签: c

我编写了一个程序,它接受用户的2个参数并将它们加在一起,例如,如果用户输入./test 12 4,它将打印出的总和是:16。

令我困惑的部分是为什么我必须使用atoi而我不能只使用argv[1] + argv[2]

我知道atoi用于将字符串转换为整数,我发现这行代码在线帮助了我的程序,但有人可以向我解释为什么需要它:

sum = atoi(argv[1])+atoi(argv[2]);

代码:

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

int main(int argc, char *argv[]) 
{

    int sum = 0;

    sum = atoi(argv[1])+atoi(argv[2]);
    printf("The sum is : %d \n", sum);
    return 0;
}

3 个答案:

答案 0 :(得分:0)

默认情况下,您的argv[i]是C字符串:

int main(int argc, char *argv[]) 

和sum是int类型。

即使您输入了数字,编译器也会将其读作char*atoi()将其视为int,因此您可以使用它进行算术运算。

[答案更新,感谢下面的评论]

答案 1 :(得分:0)

&#34;令我困惑的部分是为什么我必须使用&#34; atoi&#34;我不能只使用argv [1] + argv [2]&#34; argv参数包含程序可以作为输入的字符串列表。 C语言不会自动将字符串转换为数字,因此您必须自己执行此操作。 atoi函数将字符串作为参数并返回一个整数,然后可以将其用于所需的算术运算。 在其他语言(如C ++)中,求和字符串通常会连接它们,但在C语言中,您将遇到编译器错误。

答案 2 :(得分:0)

原因与您和您的名字之间的区别相同。用户键入&#34; ./ test 12 4&#34;所以在你的程序运行之前,用户正在使用的命令shell准备了两个数字序列,代表构成用户数字的名称的文本字符并将它们提供给你的程序 - shell直接从用户输入它们的终端获取它们。

为了添加这些序列通过名称识别的数字,您需要使用将这两个名称转换为int的函数 - 它们标识的数字的表示,用于定义哪个添加。这个功能被称为&#39; atoi&#39;这两个名称是序列{49,50,0}{52,0}(表示符号序列{'1','2','\0'}{'4', '\0'})。 0(也写为'\0')是一个特殊符号的代码,无法直接打印或输入(这是谎言,但我不想进入并且它被添加到名称的末尾,以便atoi,因为它按字符代码读取名称字符代码,知道它何时到达结尾。请注意,这些特定值取决于您使用的平台,但我假设它是一个使用ascii或utf-8的平台,而不是像ebcdic这样的平台。

作为打印结果编号的一部分,printf使用"%d"指令接受int表示答案的方式(通过添加两个int来获得答案并将其转换回答案的名称,作为准备发送回终端的字符代码{49,56}{'1','6'})。我在输出代码中遗漏了任何可能的终止0'\0'),因为printf并不指示此处的结尾,而不是您在输入中收到的结束指示shell - 终端不能像atoi那样查找结尾,而printf没有为您提供C程序中进一步使用的名称;它只是将程序名称直接发送到终端(这是命令shell连接到程序输出流的位置)。

尽管atoi不是唯一可以对数字的传入名称做的事情,但C语言的设计目的是为每个argv元素提供结束标记,因为它通常会在处理传入信息时可能需要做出任何其他选择。

尝试此操作以查看显式使用的代码(仍假设您的系统使用ascii或utf-8):

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

char const name_of_program[] = "./test";
char const name_of_first_number[] = {49,50,0}; // {'1','2','\0'} would be the same as would "12" - with the quotes
char const name_of_second_number[] = {52,0}; // {'4','\0'} would be the same as would "4" - with the quotes

int main() 
{
    char const *argv[] = {
        name_of_program,
        name_of_first_number,
        name_of_second_number,
        NULL,
    };
    int sum = 0;

    sum = atoi(argv[1])+atoi(argv[2]);
    printf("The sum is : %d \n", sum);
    return 0;
}