2016-08-27 129 views
0

我想編寫一個C程序來啓動OS X El Capitan上的特定功能。 代碼如下所示:比較變量和字符串

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

    int main() 
    { 
     char mainchoice; 
     printf(">>> "); 
     scanf("%s", &mainchoice); 
     if (strcmp(&mainchoice, "start ftp") == 0) { 
      system("ftp"); 

      } 
     else if (strcmp(&mainchoice, "start say") == 0) { 
      system("say hello"); 
     } 
     else { 
      system("say Error") 
     } 

    } 

這只是一個示例代碼。

當我運行它時,它總是通過say命令說錯誤。我究竟做錯了什麼?

+1

你知道'char mainchoice'是什麼意思嗎? – haccks

+0

'mainchoice'是*一個*字符。您正嘗試將整個字符串讀入其位置,導致未定義的行爲。 –

+0

@EugeneSh。那麼我能做些什麼才能使它工作? – luistripa

回答

1

這裏重點: -

char mainchoice; //declared as a char 

scanf("%s", &mainchoice); //using the %s placeholder which is for string 

//for character it is %c 

讓您的代碼背後的邏輯是你想輸入一個字符串不是字符。

作出這樣的字符數組: -

char mainchoice[20]; //this can hold your string, one character at one index each of the array 

因爲,你在字符串比較使用多字(「開始說」)

(strcmp(&mainchoice, "start say") == 0) 

scanf函數並不多話的工作。只要您提供空格,製表符,換行符,scanf就會停止從鍵盤讀取數據。

爲了解決這個問題,使用fgets。這是閱讀多個單詞甚至整個句子的最佳方式。 千萬不要使用gets()!它容易受到緩衝區溢出的影響!

fgets(mainchoice, 20, stdin); 
+0

好吧,那有效,但後來我又增加了一行,這次'start metasploit'不起作用。它只是跳轉到其他部分。而另外兩個更有趣的是,它們也不起作用。 – luistripa

+0

這是因爲當你敲回車完成輸入時,它會在字符串中添加一個換行符而不是'\ 0'。在輸入中拖尾換行符。見人fgets。 一個簡短的方法是找到字符串的長度,然後轉到換行符所在的最後一個索引處,並將其替換爲空字符。 –

+0

隨着「取得」它的作品。對不起,我不得不嘗試一下:-) – luistripa

0

您聲明的主要選項是字符而不是字符串。

使用字符mainchoice[10];來創建一個字符串。 並用fgets(mainchoice, 10, stdin);

尺寸替換scanf("%s",&mainchoice)是10,因爲你與長度爲9的字符串進行比較,所以(9 + 1空= 10)10就足夠了。