我编写了一个程序,它接受用户的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;
}
答案 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;
}