因此,为了便于练习,我编写了一些小代码,该代码在数组中采用可变数目的整数,然后确定最大值。
我想使程序可以从命令行(即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;
}
答案 0 :(得分:4)
argv[1]
的类型为char *
,它是指向字符的指针。 sizeof
运算符只为您提供系统上指针的大小。 argv[1][0]
的类型为char
,因此其大小为1
。
它适用于两个数字,因为“ 2,3”具有四个字符(包括空终止符),这恰好与平台上指针的大小相同。
您需要做的是在运行时使用argv[1]
函数确定strlen
的长度。
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;
}
答案 1 :(得分:2)
实际上argv[1]
是指向char
的指针,而不是char
的数组。并且考虑到指针在您的平台上的大小为4,而char
肯定为1字节,那么对此的逻辑答案是:
sizeof(argv[1]) / sizeof(argv[1][0])
4 / 1
您的代码的一个主要问题是您没有解析整数。您正在比较字符。在10,2
中,最大的将是2
。
请注意,如果要逐个字符地迭代char直到结尾,则根本不需要查找字符串的大小。您可以这样做直到找到空值。但是,如果您确实想解析字符,则此策略可能并非最简单。
一种完全不涉及数组或大小检查的方法,可以使用strtok
和strtol
将字符串解析为标记和整数。下面是一个非常简单的实现,完全没有错误检查:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int
main(int argc, char **argv)
{
int curr, max = 0;
char *token;
token = strtok(argv[1], ",");
while (token != NULL) {
curr = (int)strtol(token, (char **)NULL, 10);
if (curr > max) max = curr;
token = strtok(NULL, ",");
}
printf("The biggest integer was: %d\n", max);
return 0;
}