所以我对C很新,我正在尝试学习如何使命令行输入,我输入的是我希望是正确的语法,我试图得到它,所以你输入2个数字,它返回两个加在一起的数字。该程序确实编译,但是当我尝试运行它时,它需要参数并且它们的打印完全错误,几乎就像打印内存地址一样。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
int addition(int a, int b);
int main(int argc, char *argv[]) {
if(argc != 3) {
printf("You must enter 2 numbers!");
return TRUE;
}
else {
int answer = addition((int)*(argv[0]), (int)*(argv[1]));
printf("%d + %d = %d", argv[0], argv[1], answer);
return FALSE;
}
}
int addition(int a, int b) {
return a + b;
}
那么我做错了什么?我输入2 3时的输出是:
155 + 50 = 165
答案 0 :(得分:2)
通过**argv
传递给您的值不是整数,它们是以空字符结尾的字节字符串。为了执行添加,您首先需要使用atoi()
之类的东西将它们转换为整数。否则,您将在字符数组上执行数字加法。
答案 1 :(得分:2)
替换这些行:
int answer = addition((int)*(argv[0]), (int)*(argv[1]));
printf("%d + %d = %d", argv[0], argv[1], answer);
使用:
int answer = addition(atoi(argv[1]), atoi(argv[2]));
printf("%d + %d = %d", atoi(argv[1]), atoi(argv[2]), answer);
正如David Hoelzer在另一个回答中所说,参数包含空终止字节字符串。使用atoi()
会将字符串转换为整数。
使用argv[1]
和argv[2]
代替,因为它们实际上是包含您输入的值的那些。根据ISO C标准规范:
如果argc的值大于零,则argv [0]指向的字符串表示程序名称;如果程序名不能从主机环境获得,则argv [0] [0]应为空字符。
argv[0]
将包含该程序的名称。
有关argv[0]
作为该计划名称的更多信息,请参阅this StackOverflow answer。
关于代码,您总是可以将参数存储在如下变量中:
int a = atoi(argv[1]);
int b = atoi(argv[2]);
然后将它们传递到addition()
函数并在printf()
部分中使用它。
答案 2 :(得分:1)
int answer = addition((int)*(argv[0]), (int)*(argv[1]));
printf("%d + %d = %d", argv[0], argv[1], answer);
我担心这不会像你期望的那样奏效。 argv[x]
是指向字符的指针,而不是整数。例如,如果您输入“2 3”,argv[0]
指向表示正在运行的程序名称的字符串(如果名称不可用,则为空指针),argv[1]
指向“ 2“,argv[2]
指向”3“,argv[argc]
(即argv[3]
)指向空指针。
要转换一个字符串,它本质上是一个const char数组,只是转换不起作用。您可以改为调用atoi()
功能。这是有效的代码(没有错误处理):
#include <stdio.h>
#include <stdlib.h>
int addition(int a, int b);
int main(int argc, char *argv[]) {
if(argc != 3) {
printf("You must enter 2 numbers!");
return EXIT_FAILURE;
}
else {
int a = atoi(argv[1]), b = atoi(argv[2]);
int answer = addition(a, b);
printf("%d + %d = %d", a, b, answer);
return EXIT_SUCCESS;
}
}
int addition(int a, int b) {
return a + b;
}
输入“2 3”时,输出为“2 + 3 = 5”。
有些不敬:为什么在返回时使用TRUE
和FALSE
?为避免幻数,您可以使用EXIT_SUCCESS
和EXIT_FAILURE
。
答案 3 :(得分:1)
首先,您的输入参数从npm rebuild node-sass
开始; argv[1]
始终是您用于调用程序的字符串。
其次argv[0]
不会将(int)*(argv[1])
从字符串转换为整数;它的作用是将argv[1]
中第一个字符的字符代码从argv[1]
转换为char
。假设ASCII,如果argv [1]是int
,则该行将字符值 "10"
(ASCII 49)从类型'1'
转换为类型{{ 1}}。
您需要使用像char
或int
这样的库函数将参数从字符串转换为整数,如下所示:
atoi
阅读strtol man page以获取参数说明。