[英]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")
輸入法中非常缺失。
另外, while
的if
語句在這里是多余的,因為while
本身將捕獲字符串的結尾,並且讓input
和s
引用相同的數組沒有意義(如果你改變了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.