C 如果条件没有得到尊重

C 如果条件没有得到尊重,c,C,我对以下代码有问题: /* * 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}; ch

我对以下代码有问题:

/* 
 * 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);

}
/*
*Esercizio 5
*/
#包括
#包括
#包括
char*getProduct(char-product[]);
长getNumber(char乘积[]);
int main(int argc,字符**argv){
char product1[60]={0};
char product2[60]={0};
char product3[60]={0};
char productInput[60]={0};
int标志=0;
长期成本=0;
printf(“产品1:”);
获取(product1);
printf(“产品2:”);
获取(product2);
printf(“产品3:”);
获取(product3);
做{
printf(“产品和数量:”);
获取(productInput);
printf(“产品输入:%s\n”,getProduct(产品输入));
printf(“产品1:%s\n”,getProduct(产品1));
如果(getProduct(product1)==getProduct(productInput)){/*这里有问题*/
//不管我输入什么,它总是在这里
printf(“Selezionato prodotto 1”);
成本=getNumber(product1)*getNumber(productInput);
flag=1;
}else if(getProduct(product2)==getProduct(productInput)){
printf(“Selezionato prodotto 1”);
成本=getNumber(产品2)*getNumber(产品输入);
flag=1;
}else if(getProduct(product3)=getProduct(productInput)){
printf(“Selezionato prodotto 1”);
成本=getNumber(product3)*getNumber(productInput);
flag=1;
}
}而(!flag);
printf(“成本总计:%d”,成本);
返回(退出成功);
}
char*getProduct(char-product[]{
字符*指针;
char str_乘积[60]={0};
strcpy(str_产品,产品);
指针=strtok(str_乘积,“”);
返回指针;
}
长getNumber(字符产品[]){
字符*指针;
char str_乘积[60]={0};
strcpy(str_产品,产品);
指针=strtok(str_乘积,“”);
指针=strtok(NULL,“”);
返回strtol(指针,NULL,10);
}

您可以清楚地看到,
getProduct(productInput)
getProduct(product1)
返回指向不同值的指针。问题是,即使值不同,
如果
条件没有得到遵守。

您试图通过
==
运算符比较字符串,而该运算符没有执行您期望它执行的操作

相反,您需要通过调用
strcmp()
(或者更好的是,
strncmp()
)来比较它们


通过
==
比较字符串不能正常工作的原因是
=
比较指针(基本上是存储字符串的内存位置),而不是字符串本身。

您试图通过
=
操作符比较字符串,这并不是您期望它做的事情

相反,您需要通过调用
strcmp()
(或者更好的是,
strncmp()
)来比较它们


通过
==
比较字符串不能正常工作的原因是
=
比较指针(基本上是字符串存储的内存位置),而不是字符串本身

似乎需要逐步完成代码(调试)[at]Keyser这就是为什么我在do while cycle@Amadan中添加了两个printf,因为我需要显示这些函数是如何工作的,并且我用注释突出显示了问题发生的地方。@ShadowBroker:不,你不需要显示这些。我们不需要知道
成本
,或
标志
,或
getNumber
,或大多数
printf
语句。所有的噪音。我从来没有看到过这个评论,因为它也隐藏在三页代码中。如果您在顶部说“代码中标记了相关行”,这会有所帮助,但即使这样,您也不能免除将代码作为最小示例的责任。这一次有一些善良的人坚持帮助你;下次可能不会了。简洁而完整的问题更容易得到回答。如果你做了一个实际的“@”符号,我会得到通知。只是想让你知道。尽管如此,if语句显然是有效的。如果您一步一步地浏览代码,您可以准确地看到正在比较的内容,而不是您认为正在比较的内容。在本例中,引用而不是值。这是一种处理此类错误的好方法,这些错误无法通过反复阅读代码来解决:p@Keyser我不能在每个注释中添加多个“@”。似乎您需要逐步完成代码(调试)[at]Keyser这就是为什么我在do while cycle@Amadan中添加了两个printf,因为我需要显示这些函数是如何工作的,并且我用注释突出显示了问题发生的地方。@ShadowBroker:不,你不需要显示这些。我们不需要知道
成本
,或
标志
,或
getNumber
,或大多数
printf
语句。所有的噪音。我从来没有看到过这个评论,因为它也隐藏在三页代码中。如果您在顶部说“代码中标记了相关行”,这会有所帮助,但即使这样,您也不能免除将代码作为最小示例的责任。这一次有一些善良的人坚持帮助你;下次可能不会了。简洁而完整的问题更容易得到回答。如果你做了一个实际的“@”符号,我会得到通知。只是想让你知道。尽管如此,if语句显然是有效的。如果您一步一步地浏览代码,您可以准确地看到正在比较的内容,而不是您认为正在比较的内容。在本例中,引用而不是值。这是一种处理此类错误的好方法,这些错误无法通过反复阅读代码来解决:p@Keyser我不能在每条评论中添加多个“@”。谢谢。。。我认为我做了太多的PHP编程:)问题仍然存在,即使在您的解决方案之后。我想我知道为什么。实际上,
getProduct
函数返回的指针不是指向调用函数时传递的参数,而是
st
if(strmcp(getProduct(product1), getProduct(productInput)) == 0){