【问题标题】:strcmp will not correctly evaluate in if statements [duplicate]strcmp 将无法在 if 语句中正确评估 [重复]
【发布时间】:2015-11-24 16:10:10
【问题描述】:
#include <stdio.h>
#include <math.h>
#include <string.h>
#define size 7

int computeN(char s1[])
    {
        int n=-1;

        if(strcmp(s1, "black") == 0)
        {
            n = 0;
        }
        else if (strcmp(s1, "brown") == 0)
        {
            n = 10;
        }
        else if (strcmp(s1, "red") == 0)
        {
            n = 20;
        }
        else if (strcmp(s1, "orange") == 0)
        {
            n = 30;
        }   
        else if (strcmp(s1, "yellow") == 0)
        {
            n = 40;
        }
        else if (strcmp(s1, "green") == 0)
        {
            n = 50;
        }
        else if (strcmp(s1, "blue") == 0)
        {
            n = 60;
        }
        else if (strcmp(s1, "violet") == 0)
        {
            n = 70;
        }
        else if (strcmp(s1, "grey") == 0)
        {
            n = 80;
        }
        else if (strcmp(s1, "white") == 0)
        {
            n = 90;
        }
        printf("%d\n", n);
        return n;
    }

int computeN2(char s2[])
    {
        int n1=-1;  

        if(strcmp(s2, "black") == 0)
        {
            n1 = 0;
        }
        else if (strcmp(s2, "brown") == 0)
        {
            n1 = 1;
        }
        else if (strcmp(s2, "red") == 0)
        {
            n1 = 2;
        }
        else if (strcmp(s2, "orange") == 0)
        {
            n1= 3;
        }   
        else if (strcmp(s2, "yellow") == 0)
        {
            n1 = 4;
        }
        else if (strcmp(s2, "green") == 0)
        {
            n1 = 5;
        }
        else if (strcmp(s2, "blue") == 0)
        {
            n1 = 6;
        }
        else if (strcmp(s2, "violet") == 0)
        {
            n1 = 7;
        }
        else if (strcmp(s2, "grey") == 0)
        {
            n1 = 8;
        }
        else if (strcmp(s2, "white") == 0)
        {
            n1 = 9;
        }
        printf("%d\n", n1);
        return n1;
    }

int computeExponent(char s3[])
{
        int  exp=0;

        if(strcmp(s3, "black") == 0)
        {
            exp = 1;
        }
        else if (strcmp(s3, "brown") == 0)
        {
            exp = 10;
        }
        else if (strcmp(s3, "red") == 0)
        {
            exp = 100;
        }
        else if (strcmp(s3, "orange") == 0)
        {
            exp = 1000;
        }   
        else if (strcmp(s3, "yellow") == 0)
        {
            exp = 10000;
        }
        else if (strcmp(s3, "green") == 0)
        {
            exp = 100000;
        }
        else if (strcmp(s3, "blue") == 0)
        {
            exp = 1000000;
        }
        else if (strcmp(s3, "violet") == 0)
        {
            exp = 10000000;
        }
        else if (strcmp(s3, "gray") == 0)
        {
            exp = 100000000;
        }
        else if (strcmp(s3, "white") == 0)
        {
            exp = 1000000000;
        }
        printf("%d\n", exp);
        return exp;
    }

int computeResistance(int x, int y, int z)
{
    int omega = ((x+y) * z);
    return omega;
}


int main(void)
{
    char color_codes[10][7] = {"black","brown","red","orange","yellow","green","blue","violet","gray","white"};
    char s1[7], s2[7], s3[7];
    int  n, n1, choice;

    printf("Enter the colors of the resistor's three bands, beginning with\n");
    printf("the band nearest the end. Type the colors in lowercase letters\n");
    printf("only, NO CAPS\n");

    printf("Band 1 =>\n");              //prints prompts for bands 
    fgets(s1, size, stdin);             //stores band 1 in s1

    printf("Band 2 => \n");             //prints prompt 
    fgets(s2, size, stdin);             //stores band 2 in s2

    printf("Band 3 => \n");             //prints prompt 
    fgets(s3, size, stdin);             //stores band 3 in s3


    printf("Resistance value: %d\n", computeResistance(computeN(s1), computeN2(s2), computeExponent(s3)));  //computes resistance 

    return (0);                                             //make the exit 
}

字符串被正确存储;问题是在函数中没有在比较中找到正确的值,以便找到算法的阻力。如果用户输入“red”、“red”、“red”,则值 n、n1 和 exp 将等于 -1、-1、0。这可能是什么原因造成的?

【问题讨论】:

  • 在这里尝试 scanf 而不是 fgets。
  • 这是一个可怕的 if-ladder。使用数组和循环。
  • 另外请注意,这三个“computeXXX”函数本质上都是相同的——考虑一下如何将它们重新分解为一个函数。

标签: c fgets strcmp


【解决方案1】:

这里的问题是,fgets() 也会扫描尾随换行符并将其存储到输入缓冲区中。

在发送输入进行比较之前,您需要删除该换行符。否则,您的字符串比较很可能会失败。

一个非常简单的解决方案可以是,检查输入的字符串长度,然后检查最后一个索引值与换行符 (\n),如果发现,将其替换为 null (\0) 和然后,将输入传递给比较函数。

【讨论】:

    【解决方案2】:

    fgets 在它读取的字符串中包含换行符。您要么必须删除它,要么使用像 scanf 这样不包含换行符的函数。 (如果您使用scanf,请记住使用例如%7s 说明符来防止缓冲区溢出)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      相关资源
      最近更新 更多