为什么sizeof没有返回数组中正确数量的元素?

时间:2018-08-07 22:27:04

标签: c arrays pointers argv

因此,为了便于练习,我编写了一些小代码,该代码在数组中采用可变数目的整数,然后确定最大值。

我想使程序可以从命令行(即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;
}

2 个答案:

答案 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直到结尾,则根本不需要查找字符串的大小。您可以这样做直到找到空值。但是,如果您确实想解析字符,则此策略可能并非最简单。

一种完全不涉及数组或大小检查的方法,可以使用strtokstrtol将字符串解析为标记和整数。下面是一个非常简单的实现,完全没有错误检查:

#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;
}