簡體   English   中英

如何修復命令行參數的輸出以打印出正確的整數?

[英]How do I fix output from command-line arguments to printing out the correct integers?

#define N 10

int main(int argc, char *argv[])
{
    int *a = malloc(sizeof(N));
    int i;

    for(i = 1; i < argc; i++) {
        *(a++) = atoi(argv[i]);
    }

    i = 0;
    while(i < N) {
        printf("%d ", *(a++));
        i++;
    }
}

我對為什么我的輸出全為0感到困惑。 我不太確定如何解決它,因為我是命令行參數/指針的新手。 該程序的背景是,它接受整數,然后使用atoi將其從字符串轉換為整數,然后使用指針算術將新數組打印出來。

這有很多錯誤。

sizeof(N)給出一個整數常量的大小(大約4個字節)。 您的意思是malloc(N * sizeof(int)); 但是,如果N是Mall,並且您在編譯時就知道了,那么使用malloc沒有什么意義。 您想分配argc ints。 然后,該程序將擴展到數百萬個命令行參數,並假設shell允許輸入這么長的行。

然后,當您分配一個指針時,您需要掛在它上面。 不要增加它。 如果要使用移動指針,請使用兩個指針a和ptr。 a指向緩沖區並“擁有”它,ptr是一個隨其移動的臨時項。 但是,數組語法a [i]幾乎總是比行進指針更可取。

然后,如果argc小於N,則最后一會打印垃圾值。這可能是您在學習練習/探索性編程中想要的,但不是您通常希望實現的值。

根據我的判斷,這是您的家庭作業的解決方案。 請注意以下幾點:

  • 它不是強制轉換malloc的返回值
  • 它正在測試malloc的返回值是否為非NULL
  • 它正在釋放分配的內存
  • 它使用多種指針算法
  • 它正在更正argv [0]的用法
  • 它正在糾正argc的濫用
  • 它使用“ yoda條件”來消除編譯器愚蠢的可能性
  • 如果您提供的參數超過N ,它將仍然存在段錯誤
#define N 10
int main(int argc, char *argv[])
{
    int *numbers;

    if (NULL != (numbers = malloc(N * sizeof *numbers))) {
        for(int i = 0; i < (argc - 1); i++) {
            *(numbers + i) = atoi(argv[i + 1]);
        }

        for(int* a = numbers; a < (numbers + (argc - 1)); a++) {
            printf("%d ", *(a));
        }
        free(numbers);
    }
}

暫無
暫無

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

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