2015-11-17 145 views
1

我試圖調試一個程序,它是從標準輸入中得到值'S'或'P'。我的功能calc_resistance()需要區分這兩種情況,以及既沒有輸入'S'也沒有輸入'P'的情況。程序總是評估第三種情況(既不是'S'也不是'P'),爲什麼這樣呢?比較從標準輸入讀取的字符輸入

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

float calc_resistance(char conn) { 

float retval = 0.0; 

if (conn == 'S') { 
    retval = 1; 
} 
else if (conn == 'P') { 
    retval = 2; 
} 
else { 
    retval = -1; 
} 
return retval; 
} 

int main() { 
    char connection_type[25]; 
    float resistance = 0.0; 

    while(1) { 
    printf("Enter 'S' or 'P': "); 
    scanf("%s", connection_type); 
    if(strlen(connection_type) != 1 || 
     (strncmp(connection_type,"S",25) && strncmp(connection_type,"P",25))) { 
     printf("Answer not understood. Enter 'S' or 'P'.\n"); 
     continue; 
    } 
    break; 
} 

    resistance = calc_resistance(connection_type); 

    printf("Connection type: %f", resistance); 

} 

回答

2

你正在做的這個錯誤是當它被定義爲只接受單一char到一個數組傳遞給calc_resistance()功能。

眼看輸入模式,connection_type並不需要是一個數組,%c格式說明符的幫助下,你可以很容易地connection_type一個char變量輸入工作。

您可以通過scanf()man page瞭解更多。另外,在每次迭代之後,不要忘記清除剩餘的換行

道德故事::啓用編譯器警告並注意它們。

0

你想檢測前兩個案件嗎?如果是,那麼嘗試這一個,而不是在你的功能

calc_resistance(connection_type)
只傳遞一個字符,然後嘗試傳遞整個地址,你可以修改代碼如下。

 

    #include 
    #include 
    #include 

    float calc_resistance(char conn) 
    { 

      float retval = 0.0; 

      if (conn == 'S') 
      { 
        retval = 1; 
      } 
      else if (conn == 'P') 
      { 
        retval = 2; 
      } 
      else 
      { 
        retval = -1; 
      } 
      return retval; 
    } 

    int main() 
    { 
      char connection_type[25]; 
      float resistance = 0.0; 

      while(1) 
      { 
        printf("Enter 'S' or 'P': "); 
        scanf("%s", connection_type); 

        if (strlen(connection_type) != 1 || (strncmp(connection_type,"S",25) && strncmp(connection_type,"P",25))) 
        { 
          printf("Answer not understood. Enter 'S' or 'P'.\n"); 
          continue; 
        } 
        break; 
      } 

      resistance = calc_resistance(connection_type[0]); 

      printf("Connection type: %f", resistance); 

    }