2013-11-20 51 views
-3

我一直在試圖解決這個問題,但無法理解。 如果下面的程序(MYPROG)從命令行運行爲:找到一個C程序的輸出

myprog friday tuesday sunday 

會是什麼輸出?

#include<stdio.h> 
int main(int argc, char *argv[]){ 
    while(sizeof argv) 
     printf("%s",argv[--sizeof argv]); 
    return 0; 
} 

輸出是─

sunday tuesday friday myprog 

請解釋一下我的輸出。 感謝名單:-)

+7

'--sizeof argv'是非法的。所以你的程序不能從命令行運行,因爲它甚至不能編譯。 – Paul92

+2

輸出應該是類似於「錯誤:無法應用' - '到右值」。 –

+1

即使它編譯完成,它也會在你運行時陷入一個無限循環,並且當你走出argv的界限時會崩潰。 'while(sizeof argv)'不會終止。 – indiv

回答

0

錯誤:

lvalue required as decrement operand

它不編譯。

sizeof是一個運算符,就像+%它給你一個對象的大小。所以,你不能減少它。就像這樣服用點就沒有任何意義:--%

問題的要點是:

What happens if the input is: myprog friday tuesday sunday

When the code does:

index = lastIndex 
while(index) // note: while(0) == false 
    print(array[--index]) 

因此,輸出將是元素的逆轉:

sunday tuesday friday

+0

plz檢查鏈接[鏈接] {http://www.cquestions.com/2012/05/aptitude-questions-and-answers-in-c.html} –

+0

問題21。同樣的問題和輸出是選項c。 –

+0

作者犯了一個錯誤。我會編輯我的答案。 – givanse

0

無視--sizeof問題,我假設你想知道argv的元素。 它包含參數和程序的名稱。閱讀任何描述argv的手冊或文檔。

0

有在你的代碼的兩個問題:

  1. --sizeof argv is illegal。這會導致錯誤。

  2. while(sizeof argv)將導致一個無限循環的條件永遠是真

因此,在短期的代碼將無法編譯,並會導致錯誤。

2

我猜你真的這是什麼。它只是向後打印命令行參數。

#include<stdio.h> 

int main(int argc, char *argv[]) 
{ 
    while (argc) 
     printf("%s ", argv[--argc]); 

    printf("\n"); 

    return 0; 
} 
+0

thanx,但是當argc變成0時,那麼while(0)這意味着false,那麼爲什麼它會打印myprog。它會一直打印到星期五。 –

+1

因爲它使用* pre-decrement *。當'argc'爲1時,'argv [ - argc]'是'argv [0]'。 – Barmar

+0

因爲--argc。它在while循環計算爲0之前打印argv的3,2,1,0個元素。 – Duck

0

你可能想了解下命令行參數處理當你給出的程序參數一些列表,例如,

myprog friday tuesday sunday 

C語言提供的參數給main()函數其中提供了參數的數量(在這種情況下爲4)以及一個char *(指針)數組。

請注意,sizeof argv是在編譯時計算出來的,其值是系統上指針的大小(4或8)。

首先,我們解釋一下參數的主要功能,

int main(
    int argc, //an integer count of the number of arguments provided to the program 
    char* argv[] //an array of pointers to character arguments 
) 

你的主要功能被定義到(顯然)打印出來的論點開始在最右邊的參數和工作回到零個參數,

{ 
    int argv_sizeof = argc; //you cannot use sizeof argv the way you specified 
    //argv_sizeof = 4 in your example, but argv[4] is not valid 
    //argv_sizeof has a value that is one past the rightmost element of argv[] 
    while(argv_sizeof) //use argv_sizeof > 0 here; argv_sizeof is 4,3,2,1,0 
         //when argv_sizeof reaches 0, the while loop terminates 
    { 
     printf("%s",argv[--argv_sizeof]); //here you pre-decrement argv_sizeof (3,2,1,0) 
     //then use argv_sizeof to index into argv[] 
     //then you print the string at argv[3], argv[2], argv[1], argv[0] 
    } 
    //argv_sizeof = 0 here 
    return 0; //you return the value 0 from the main function 
}