2013-05-15 5 views
0

Я довольно новичок в C, и я пытаюсь понять, используя строки и strcmp, чтобы сравнить две строки в операторе if.Использование strcmp в операторе if

Моя цель состоит в том, чтобы иметь возможность запускать другую функцию в зависимости от того, что пользователь ввел.

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

void gasbill(); 
void electricitybill(); 

int main() 
{ 
    char input[20]; 
    const char gasCheck[4] = "gas"; 
    const char electricityCheck[13] = "electricity"; 

    printf("Your bills explained!\n\n"); 
    printf("In this application I will go through your gas and electricty bills.\n"); 
    printf("I will explain how each of the billing payments work, \nand the calculations that go on,\n"); 
    printf("to create your bill.\n\n"); 
    printf("Please choose a bill to get started with:\n- gas\n- electricity\n\n"); 
    fgets(input, 20, stdin); 

    if (strcmp (input, gasCheck)== 0){ 
    printf("\nPreparing to run Gas bill!\n\n"); 
    system("PAUSE"); 
    system("cls"); 
    gasbill(); 
    system("PAUSE"); 
    } 
    else if (strcmp (input, electricityCheck)== 0){ 
    printf("\nPreparing to run Electricity bill!\n\n"); 
    system("cls"); 
    electricitybill(); 
    system("PAUSE");} 
    else { 
    printf("\nError exiting...\n\n"); 
    system("PAUSE"); 
    } 

    return 0; 
} 

void gasbill() 
{ 
    float balanceBroughtForward, gasThisQuarter, subTotalPerQuarter; 
    char poundSign = 156; 

    printf("******Your gas bill, explained!******\n\n\n"); 
    printf("Hello, and welcome to your gas bill, explained. Let's get started.\n"); 
    printf("Please enter the balance brought forward from your previous statement: \n\n%c", poundSign); 
    scanf("%f", &balanceBroughtForward); 
    printf("\nHow this works:\n- The money that you did not pay last quarter for your gas bill\nhas been added to this quarterly payment\n\n"); 
    printf("\nNext let's add this to the amount of gas you have spent this quarter. \n(how much gas have you used so far in this billing period?)"); 
    printf(": %c", poundSign); 
    scanf("%f", &gasThisQuarter); 
    printf("\n\nNow what? The two values that you have entered\n(balance brought forward 
    and gas spent this quarter)\nare added together, %c%3.2f + %c%3.2f\n", poundSign, 
    balanceBroughtForward, poundSign, gasThisQuarter); 
    subTotalPerQuarter = (balanceBroughtForward + gasThisQuarter); 
    printf("This is"); 
} 

void electricitybill() 
{ 
    printf("Empty"); 
    system("PAUSE"); 
} 

Когда он запускает оператор if, он всегда выполняет функцию gasBill, а не функцию electricBill.

Заранее спасибо.

+0

Попробуйте положить нуль в конце вашей Const символ вручную. Это может устранить расхождение. – Magn3s1um

+0

Используя немного менее раздутую версию, служащую в качестве примера, код выше работал для меня. Я получаю газ, электричество или ошибку, в зависимости от того, что я пишу. – JugsteR

ответ

5

fgets вернет строку, которая заканчивается символом новой строки (\n). Из документации

читает символы из потока и сохраняет их в виде строки С в ул до (Num-1) символы были считаны или либо символ новой строки или истекшим файла достигается, в зависимости от того происходит первый.

Вы можете либо тест на символ новой строки и полосы его

fgets(input, 20, stdin); 
size_t len = strlen(input); 
if (input[len-1] == '\n') { 
    input[len-1] = '\0'; 
} 

или читать ввод данных пользователем с использованием scanf вместо этого.

scanf("%19s", input); 

Как и в сторону

const char gasCheck[4] = "gas"; 
const char electricityCheck[13] = "electricity"; 

может быть объявлена ​​немного более легко и безопасно, как

const char *gasCheck = "gas"; 
const char *electricityCheck = "electricity"; 

(Эта форма сохраняет копирование строки литералов в переменные стека. Более того, она удаляет потенциальный источник ошибок, если вы жестко кодируете слишком малую длину для массивов.)

+0

Приобретенный, я бы избегал использования scanf, так как это может привести к проблемам безопасности и ошибкам, поскольку он может писать больше, чем размер строки. – user1115057

+0

Hmmm ... +1 для указания 'fgets()', -1 для использования пресловутого 'scanf()' для чтения пользовательского ввода. Пробелы в пользовательском вводе могут дать вам что-то другое, чем ожидалось, например ... – DevSolar

+0

@ user1115057 Строка формата ''% 19s'' будет читать не более 19 символов (плюс нулевой ограничитель), поэтому гарантируется, что они не будут писать за пределами конец 'input' – simonc

0

fgets() читать символы из stdin до тех пор, пока не увидит новую строку или EOF, если бы увидела новую строку, она будет сохранена в массиве. В любом случае fgets() добавляет нулевой символ в массив.

так что если вы хотите закончить ввод, символ новой строки, мое незначительное изменение здесь, это изменить

const char gasCheck[4] = "gas"; 
const char electricityCheck[13] = "electricity"; 

в

const char gasCheck[5] = "gas\n"; 
const char electricityCheck[14] = "electricity\n"; 
Смежные вопросы