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

标签 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;
}

最佳答案

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/

相关文章:

c - 我的预期结果在 Bison 中不起作用

c - 65535和65535UL有什么区别

javascript - 设置输入值,然后禁用并移至下一个空输入

改变指针数组的内容

c - IAR 的新 EWAVR32 (4.20)。编译器对内联汇编更加严格

c - 对文件进行数学运算

python - Cython 类型的内存 View : what they really are?

javascript - 我可以将数组从 Google 电子表格传递到 Google App Script 方法吗?

ios - 在 swift 中自动更新 var update 处的 UILabel

c - 函数根据数字删除单词 - C 编程