2013-04-16 146 views
2

我想要求用戶輸入一個字符串,所以我會打印字符串的長度。我的代碼構建成功。但是,當我輸入一個單詞並按下「輸入」時,程序繼續運行。我不得不輸入第二個單詞,然後顯示第一個字符串的長度。我對argv [1]感到困惑。有人可以給我一些提示和提示如何解決這個問題嗎?在此先感謝您的時間。我的代碼有什麼問題?什麼是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; 
} 
+3

'的argv [1]'是第一個命令行參數,但在這個代碼中根本不使用它; 's'最初被設置爲指向它,但在該值被使用之前,'s'被設置爲指向'input'。 – Arkku

+0

我不太確定我們是否理解你想要你的代碼做什麼。你能給我們一個你期待的輸入和輸出的例子嗎? – Xymostech

+0

您的輸入可以是用空格分隔的多個單詞嗎?或者,你是否將此限制爲只有單個字輸入? –

回答

0

只要改變scanf行:

scanf("%s", s); 

當你擁有它(scanf("%s\n", s);),它要求在\n結束字符的sequnce,那麼當輸入完成另一個\n來表示。

4

argv[]是保存命令行參數的數組,argv[1]是第一個(當然除argv[0]以外的命令表示本身)。您將其指定給s,然後立即覆蓋s,因此在此不需要。

您必須輸入的原因兩行行是輸入格式末尾的\n。它需要任何可匹配的格式字符串後跟一個換行符,因此%s\n吃了你的第一個換行符,因此scanf必須返回另一個換行符。

%s它自己會解決這個問題,但引入另外一個,如果你是後輸入的全 - 它會只讀到第一個空格。有關正確的線路輸入功能,請參閱here

它實現了全線輸入,防止緩衝區溢出和檢測/清除過長的行,在scanf("%s")輸入法中缺少某些東西。

此外,whileif說法是多餘這裏,因爲while本身會趕上字符串的結尾,並沒有什麼意義兼得inputs指同一陣列(它化妝感覺是否在某個時候改變了s,但這不是在這裏發生的)。

因此,變體沒有先進行iput功能可以簡單:

#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,這是選擇高級輸入功能的另一個原因(另一個非常重要的原因是爲了避免在程序中引入緩衝區溢出漏洞)。

2

argv用於傳遞進程參數。這意味着你可以像

a.out 123 abcd 

的argv [1]將已經分配到123的值,你不必看它,你現在所做的運行程序。在你當前的代碼中,在用argv [1]賦值之後,你將s的引用覆蓋到一個新的字符串中。

1

這是你想要的

#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 
    ------------------------------------------------*/ 
+0

如果可能解釋的argv他以及= d – Thomas

+0

argv的是(字符*)的陣列,即 的bash> a.out的ABC 的argc = 5, 的argv [0] = a.out的, argv [1] = A, argv [2] = B, argv [3] = C, –

+0

這只是一個關於如何編輯答案以改進它的建議;) – Thomas