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