簡體   English   中英

我的代碼出了什么問題? 什么是argv [1]?

[英]What's wrong with my code? What is argv[1]?

我試圖讓用戶鍵入一個字符串,所以我將打印字符串的長度。 我的代碼構建成功。 但是,當我輸入一個單詞並按下'enter'時,程序繼續運行。 我必須輸入第二個單詞,然后顯示第一個字符串的長度。 我對argv感到困惑[1]。 有人可以給我一些提示並暗示如何解決這個問題嗎? 在此先感謝您的時間。

請注意,我不允許使用任何字符串功能。

   int main(int argc, char* argv[]){

    char* s=argv[1];

    char input[256];
    s = input;
    printf("Please enter a string: ");
    scanf("%s\n", s);
    int str_length = 0;
    while (s[str_length] != '\0')
    {
        str_length++;
        if (s[str_length] == '\0') break;
    }

    printf("%d\n", str_length);


    return 0;   
}

argv[]是保存命令行參數的數組, argv[1]是第一個(當然,除了命令表示本身在argv[0]中)。 你將它分配給s然后立即覆蓋s ,所以這里不需要它。

您必須輸入行的原因是輸入格式末尾的\\n 它需要能夠匹配格式字符串后跟換行符的任何內容,因此%s\\n正在第一個換行符,因此scanf必須返回另一個換行符。

它自己的%s將解決這個問題,但如果你所追求的是一整輸入,它會引入另一個問題 - 它只會讀到第一個空格。 有關正確的線路輸入功能,請參見此處

它提供全線輸入,防止緩沖區溢出和檢測/清除太長的行,這在scanf("%s")輸入法中非常缺失。

另外, whileif語句在這里是多余的,因為while本身將捕獲字符串的結尾,並且讓inputs引用相同的數組沒有意義(如果你改變了s ,那是有意義s某點,但這不會發生在這里)。

因此, 沒有高級線路輸入功能的變體可能很簡單:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char* argv[]) {
    char input[256];
    int str_length = 0;

    printf ("Please enter a string: ");
    scanf ("%s", input);
    while (input[str_length] != '\0')    /* Or consider using strlen() */
        str_length++;

    printf ("%d\n", str_length);

    return 0;
}

如果輸入Hello ,您將看到它立即打印出5 如果輸入Hello Pax ,你也會看到5 ,這是選擇高級輸入功能的一個原因(另一個非常重要的原因是避免在程序中引入緩沖區溢出漏洞)。

argv用於傳遞進程參數。 這意味着您可以運行您的程序

a.out 123 abcd

argv [1]已經被賦值為123.你不必像現在這樣讀它。 在當前代碼中,在使用argv [1]進行分配后,將覆蓋s對新字符串的引用。

這就是你想要的

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MAX 100

int main(int argc, char* argv[]){
    char tmp[MAX];
    printf("Plese enter a string:\n");
    scanf("%s", tmp);
    printf("the length is %d\n", strlen(tmp));

    return 0;   
}

argv和argc是這樣的另一件事:argv [0] = a.exe argv [1] = 12345

int main(int argc, char* argv[]){
    printf("the length is %d\n", strlen(argv[1]));

    return 0;   
}
/*-------------------- Output --------------------
 > a.out 12345
 the length is 5
  ------------------------------------------------*/

只需更改scanf行:

scanf("%s", s);

正如你所擁有的那樣( scanf("%s\\n", s); ),它需要一個以\\n結尾的字符序列,然后是另一個\\n來表示輸入完成的時間。

暫無
暫無

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

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