2017-03-18 35 views
0

我寫了一個小型的c程序,顯示輸入的文本,如果輸入的文本是「顯示版本」,則顯示版本。 以下是示例代碼Strcmp和getchar

#include<stdio.h> 
#include<string.h> 
void main(){ 
int i; 
char j = (char) i; 
while(i != '#'){ 
i = getchar(); 
if(strcmp(&j, "show version")) printf("v1"); 
else putchar(i); 
}} 

它爲每個char + 1打印v1。 任何建議。

+0

'j'的值是未知的......當您設置'i'時,它不會被修改,因爲您在更改'i'後不會將'i'分配給'j'。另外,'strcmp()'期望空終止的字符串...指向單個(可能)非空'char'的指針是不夠的 - 它將繼續讀取該單個字符直到它找到空字符或已經存在確定字符串不匹配。換句話說,你有很多未定義的行爲,似乎對語言的工作方式有一些誤解。 (並且這些不是代碼的唯一問題) – Dmitri

回答

0

閱讀man pages for strcmp

strcmp返回值是0如果兩個字符串相等,其在C狀態被認爲是等效於

您if..statement更改爲以下:

if(strcmp(&j, "show version") == 0) printf("v1"); 

注:爲了使您的代碼解析字符串,則需要每次讀取到一個字符串的字符追加。

#define LINE_SIZE 512 

int main(){ 
    char *line = malloc(LINE_SIZE); 
    while(fgets(line, LINE_SIZE, stdin)) { 
     if(strncmp(line, "show version", strlen(line) - 1) == 0) { 
      printf("v1\n"); 
     } else { 
      continue; 
     } 

     break; 
    } 

    return 0; 
} 

我之所以用strncmp(而不是strcmp)和strlen(line) - 1是因爲fgets也抓住時輸入回車鍵/換行符。這只是一個例子 - 不要忘記釋放你的記憶!

+0

(在原始代碼中)'&j'甚至沒有引用空終止的字符串,並且j的值是從一個未初始化的變量?或者'j'在循環中沒有修改(只有'i')? – Dmitri