因此,为了练习,我编写了一些代码,它采用数组中可变数量的整数,然后确定最大值。
我想让程序可以从命令行运行(即 findMax 4, 5, 6, 20, 1, 3
以完全相同的格式)。
所以考虑到 argv[1]
是一个指向 char
的指针数组,我想我可以从 argv[1][0]
循环至argv[1][n]
.
我认为指针是我无法让我的代码工作的原因。
在第一个代码中,我使用
sizeof(arr) / sizeof(arr[0]) = # of elements in array 'arr'
正确地给了我元素的数量。
然而,当我运行时
sizeof(argv[1]) / sizeof(argv[1][0]) = always return (integer) 4
我是否正确地认为我在这里使用了指针,这就是大小始终相同的原因?我尝试取消引用它们两个(分别和一起),但它产生了更令人困惑的结果。
这是完整的代码,但不起作用。 除了由于某些奇怪的原因,它仅在我输入恰好两个数字时才有效(即 findMax.exe 2, 3 将正确确定“3”是最大的数字)。
#include <stdio.h>
int main(int argc, char *argv[]) {
printf ("Finding largest value from input: %s", argv[1]);
int size = (int)sizeof(argv[1]) / (int)sizeof(argv[1][0]);
int x = 0;
int next;
int biggest = 0;
while (x < size) {
if (argv[1][x] != ',') {
next = argv[1][x];
printf("\n%c", (int)next);
if ((int)next > biggest) {
biggest = next;
}
}
x++;
}
printf("\nBiggest # is: %c", biggest);
return 0;
}
最佳答案
argv[1]
是 char *
类型,指向字符的指针。 sizeof
运算符仅提供系统上指针的大小。 argv[1][0]
的类型为 char
,因此其大小为 1
。
它适用于两个数字,因为“2,3”有四个字符(包括空终止符),这恰好与平台上指针的大小相同。
您需要做的是在运行时使用 strlen
函数确定 argv[1]
的长度。
int size = strlen(argv[1]);
但是还有其他一些事情可能会导致问题:
如果您不向函数传递任何参数,则行为未定义,因为 argv[1]
不存在。您应该检查argc
传递了多少参数。
您所做的 int
类型转换直到下一个 ,
才会读取整数,正如您的示例用法所暗示的那样。
这是一个应该可以工作的程序:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int next, biggest=INT_MIN;
char *token;
if(argc != 2)
{
printf("Wrong arguments.\n");
return -1;
}
char input[strlen(argv[1])+1];
strcpy(input, argv[1]);
printf ("Finding largest value from input: %s\n\n",argv[1]);
token = strtok(input, ",");
while(token)
{
next = atoi(token);
if(next>biggest)
{
biggest = next;
}
token = strtok(NULL, ",");
}
printf("Biggest # is: %d\n",biggest);
return 0;
}
关于c - 为什么 sizeof 没有返回数组中正确的元素数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51736276/