[英]how and why sizeof(a)/sizeof(a[0]) in c is used to calculate the number of elements in an array
[英]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直到結尾,則根本不需要查找字符串的大小。 您可以這樣做直到找到空值。 但是,如果您確實想解析字符,則此策略可能並非最簡單。
完全不涉及數組或大小檢查的方法可以使用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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.