采取主要论点
Taking main argument
我的代码有问题。我想知道“变化”值是多少。但它总是给我极高或负值。因此,当我在终端中输入例如 ./NAME 3 时,我得到了另一个数字。我该如何解决?
#include <stdio.h>
#include <cs50.h>
int main(int argc, string argv[])
{
int variation = (int)argv[1];
if (argc == 2)
{
printf("%i\n", variation);
return 0;
}
else
{
return 1;
}
}
[注意:C
没有内置 string
类型。 C
的内容是 character array
]
这是一个很容易解决的问题。这是给出的代码,它使用 stdlib
的内置 atoi
函数将 string
转换为 int
:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc == 2) {
char *var_str = argv[1];
int variation = atoi(var_str);
printf("variation: %d\n", variation);
}
else if (argc < 2) {
printf("no agrument provided.\n");
} else {
printf("only one argument was expected. %d provided.\n", argc);
}
return 0;
}
更新(使用strtol
的更安全的版本):
因为 strtol
是一个比 atoi
更好的将 string
转换为 long int
的函数,因为它是错误检测 utility
,所以更好在这方面使用 strtol
。用户 @klutt
严格执行这种做法。我要感谢 her/him 建议我也包含使用 strtol
的代码。如下所示:
// a more secure version
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
int main(int argc, char *argv[]) {
if (argc == 2) {
char *var_str = argv[1];
char *text = NULL;
int base = 10; // default base
errno = 0; // intializing errno
long int variation = 0;
variation = strtol(var_str, &text, base);
// now on to error detection
// full error trace
if (var_str == text) {
printf ("error: no number found\n");
} else if (errno == ERANGE && variation == LONG_MIN) {
printf ("error: underflow\n");
} else if (errno == ERANGE && variation == LONG_MAX) {
printf ("error: overflow\n");
} else if (errno != 0 && variation == 0) {
printf ("error: unknown error\n");
} else if (errno == 0 && var_str && !*text) {
printf ("variation: %ld\n", variation);
} else if (errno == 0 && var_str && *text != 0) {
printf ("variation: %d, but some text included: %s\n", variation, text);
}
} else if (argc < 2) {
printf("no agrument provided.\n");
} else {
printf("only one argument was expected. %d provided.\n", argc);
}
return 0;
}
有什么问题可以评论问我...