C код, кажется, пропускает, если заявления - PullRequest
2 голосов
/ 04 октября 2011

Прежде всего, я не прошу никого писать программу для меня или делать домашнее задание для меня ... У меня ошибка, и я не могу понять, что ее вызывает, и где искать, чтобы ее исправить..

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

Вот код в его нынешнем виде:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>

void usage(char *prog_name) //usage file if input format is wrong
{
    printf("Usage: %s, <-h>|<-l>|<-w>|<-p>, <filename>\n", prog_name);
    exit(0);
}

void help(char *prog_name, char *filename) //help file for -h option
{
    printf("Welcome to the help file\n");
    printf("For number of lines, enter: <%s>, <-l>, <%s>.\n", prog_name, filename);
    printf("For number of words, enter: <%s>, <-w>, <%s>.\n", prog_name, filename);
    printf("To list the palindromes in alphabetical order, print the number of
    palindromes, and to check them against the dictionary, enter: <%s>, <-p>, <%s>\n",
    prog_name, filename);
    exit(0);
}

void fatal(char *);  //function for fatal errors
void *ec_malloc(unsigned int);  //error-checked malloc wrapper

void linecount(char *filename)  // counts the number of lines of input file
{
    char *infile;
    infile = (char *) ec_malloc(strlen(filename));
    strcpy(infile, filename);
    FILE *fp = fopen(infile, "r");

    if (fp == NULL)         
         fatal("input file does not exist");

    int ch;
    int count = 0;                                  

    do {             
    ch = fgetc(fp);
    if( ch== '\n')
            count++;
    }   
    while( ch != EOF );                                 

    printf("Total number of lines %d\n",count);
    exit(0);            
}

int main(int argc, char *argv[])
{
    if (argc < 3) //if there aren't enough arguments, display the usage file
    {
            usage(argv[0]);
    }
    else if (argv[1] == "-h") //this is the help option
    {
        help(argv[0], argv[2]);
    }
    else if (argv[1] == "-l") //this is the line count option
    {
        linecount(argv[2]);
    }
    else
    {

            fatal("skipped if functions");
    }
    return 0;
}
void fatal(char *message) //this function displays an error message and then exits
{   
    char error_message[100];
    strcpy(error_message, "[!!] Fatal Error ");
    strncat(error_message, message, 83);
    perror(error_message);
    exit(-1);
}

void *ec_malloc(unsigned int size) //wrapper function for an error checked malloc
{
    void *ptr;
    ptr = malloc(size);

    if(ptr == NULL)
        fatal("in ec_malloc() on memory allocation");

    return ptr;
}   

Итак, когда я запускаю:

gcc -o fr filereader.c

./fr -h fevbwervrwe.txt

, я получаю сообщение об ошибке, в котором говорится, что операторы if были пропущены.

То же самое, если я пытаюсь запустить

./fr -l vrweqvervvq.txt

Кажется, компилятор пропускает мои операторы if, и я, честно говоря, не могу понять, почему.Любая помощь будет принята с благодарностью.

Ответы [ 7 ]

10 голосов
/ 04 октября 2011

Попробуйте strcmp() вместо ==.

6 голосов
/ 04 октября 2011
if (argv[1] == "-h")

Это утверждение сравнивает два указателя, а не две строки.Попробуйте:

if (strcmp(argv[1], "-h") == 0)
5 голосов
/ 04 октября 2011

В C вам нужно сравнивать строковые значения, используя такие функции, как

strcmp(str1, str2);

Не сравнивайте строковые значения с помощью оператора ==;который проверяет что-то совершенно другое.

3 голосов
/ 04 октября 2011

Скомпилируйте с помощью "gcc -g -o fr filereader.c" и перейдите под отладчик (например, gdb).

Уверяю вас, компилятор не "игнорирует" ваши "if" выражения.

НЕ используйте "argv [1] ==" -h ". Используйте" if (strcmp (argv [1], "-h") == 0 "вместо ...

2 голосов
/ 04 октября 2011

В C вы не сравниваете строки с оператором ==. Вместо этого вы используете следующую идиому:

if (strcmp(s1, s2) == 0) { ... }
1 голос
/ 04 октября 2011

Попробуйте strcmp () вместо == as == сравнивает адрес, где хранятся строковые значения Но strcmp сравнивает содержимое (строковые значения), которое требуется, я думаю

например. int main () {char * a = "anshul"; char * b = "anshul"; if (a == b) {printf ("ok");} / адрес comapres, где хранится anshul / if (strcmp (a, b)) {printf ("ok"); / * это будет сравнивать значения, т.е. строка anshul поэтому всегда равна, но в предыдущем случае это зависит от того, хранятся ли оба anshul в одной и той же памяти или нет так что не рекомендуется делать

1 голос
/ 04 октября 2011

Как уже упоминалось, просто поймите, что "argv [1]" == "-h" будет означать, что вы сравниваете указатели. Имейте это в виду.

И еще одно предложение, которое у меня есть для вас, - взглянуть на getopt(). Это используется для анализа аргументов командной строки в Unix, и облегчит вашу жизнь и поможет вам в написании надежного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...