簡體   English   中英

為什么sizeof沒有返回數組中正確數量的元素?

[英]Why is sizeof not returning the correct number of elements in array?

因此,為了練習,我編寫了一些小代碼,該代碼在數組中采用可變數量的整數,然后確定最大值。

我想使該程序可從命令行運行(即以完全相同的格式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;
}

事實上argv[1]是指向一個char ,而不是陣列char 考慮到指針在您的平台上的大小為4,而char肯定為1字節,則邏輯上是4:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM