我编写了一个程序,该程序从用户那里接收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;
}

最佳答案

原因与您与姓名之间的差异相同。用户键入“ ./test 12 4”,因此在您的程序运行之前,该用户正在使用的命令外壳程序准备了两个数字序列,这些序列表示代表用户编号名称的文本字符,并将其提供给您的程序-外壳程序直接从用户在其中键入内容的终端获得。

为了添加这些序列按名称标识的数字,您需要使用一个将这两个名称转换为int的函数-表示它们所标识的数字的表示形式。此功能称为“ atoi”,两个名称分别是序列{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程序中进一步使用的名称;它只是将名称直接从程序中显示出来,以显示给终端(这是命令外壳程序连接到程序输出流的位置)。

尽管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;
}

关于c - 有人可以向我解释这实际上是如何工作的(atoi),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45927721/

10-15 00:36