2012-05-27 58 views
1

我在與下面的代碼有問題:如果不被尊重的條件

/* 
* Esercizio 5 
*/ 

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

char* getProduct(char product[]); 
long getNumber(char product[]); 

int main(int argc, char** argv) { 

    char product1[60] = {0}; 
    char product2[60] = {0}; 
    char product3[60] = {0}; 
    char productInput[60] = {0}; 

    int flag = 0; 
    long cost = 0; 

    printf("Product 1: "); 
    gets(product1); 
    printf("Product 2: "); 
    gets(product2); 
    printf("Product 3: "); 
    gets(product3); 

    do { 

     printf("Product and quantity: "); 
     gets(productInput); 
     printf("productInput: %s\n", getProduct(productInput)); 
     printf("product1: %s\n", getProduct(product1)); 
     if(getProduct(product1) == getProduct(productInput)){ /* PROBLEM HERE!!! */ 

      // No matter what i input it always goes here 
      printf("Selezionato prodotto 1"); 
      cost = getNumber(product1) * getNumber(productInput); 
      flag = 1; 

     } else if(getProduct(product2) == getProduct(productInput)){ 

      printf("Selezionato prodotto 1"); 
      cost = getNumber(product2) * getNumber(productInput); 
      flag = 1; 

     } else if(getProduct(product3) == getProduct(productInput)){ 

      printf("Selezionato prodotto 1"); 
      cost = getNumber(product3) * getNumber(productInput); 
      flag = 1; 

     } 

    } while(!flag); 

    printf("Costo totale: %d", cost); 

    return (EXIT_SUCCESS); 
} 

char* getProduct(char product[]){ 

    char *pointer; 
    char str_product[60] = {0}; 

    strcpy(str_product, product); 

    pointer = strtok(str_product, " "); 

    return pointer; 

} 

long getNumber(char product[]){ 

    char *pointer; 
    char str_product[60] = {0}; 

    strcpy(str_product, product); 

    pointer = strtok(str_product, " "); 
    pointer = strtok(NULL, " "); 

    return strtol(pointer, NULL, 10); 

} 

正如你可以清楚地看到,getProduct(productInput)getProduct(product1)返回指針爲不同的值。問題是,即使值不同,if條件不受尊重。

+0

好像你需要通過你的代碼(調試) – keyser

+0

[at] Keyser這就是爲什麼我添加了兩個printf裏面的do-while循環 @Amadan我把整個代碼因爲在以顯示這些功能是如何工作的,並且我通過評論突出了問題的發生地點。 – siannone

+0

@ShadowBroker:不,你不需要顯示那個。我們不需要知道「cost」,「flag」,「getNumber」或大部分「printf」語句。所有 - 噪音。我從未看過評論,因爲它也被埋在三頁代碼中。如果你在頂部說「相關行被標記在代碼中」,那麼它會有所幫助,但即使如此,你也不能讓你的代碼成爲一個簡單的例子。這次有些善良的人堅持不懈地幫助你;下次也許不會。簡潔但完整的問題獲得更好的答案機會。 – Amadan

回答

6

您試圖通過==運算符來比較字符串,但這不符合您的期望。

相反,你需要將它們通過調用strcmp()(或更好,但strncmp())比較

if(strmcp(getProduct(product1), getProduct(productInput)) == 0){ 

爲什麼由==比較字符串不能正常工作的原因是==比較指針(基本上,存儲位置在那裏字符串存儲),而不是字符串本身

+0

謝謝......我想我做了太多的PHP編程:) – siannone

+0

即使在您的解決方案之後,問題仍然存在。我想我知道爲什麼。實際上'getProduct'函數返回一個指針,當我調用該函數時,該指針並不指向我傳遞的參數,而是位於'getProduct'函數內的'str_product'變量。 我使用'str_product'作爲產品參數的副本,因爲'strtok'修改了字符串,我不希望發生這種情況。 – siannone

+0

@ShadowBroker - 你是對的,這是一個懸掛指針的經典案例。您需要將字符串的副本傳遞給'getProduct',而不是製作副本。 – Attila