Getopt не захватывает и не хранит мой вклад в C - PullRequest
0 голосов
/ 09 июня 2018

Это мой первый пост на этом сайте, поэтому, пожалуйста, простите за любые ошибки форматирования.Я пишу небольшую программу для получения простой информации из файла, например количества слов, сортировки и т. Д. Однако я начал с использования getopt, так как хочу использовать командную строку для разбора моих команд.Это то, что я до сих пор.

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

int value = 0;

int main(int argc, char **argv) {
    extern char *optarg;
    extern int optind;
    int c, err = 0;
    int cflag = 0, sflag = 0, fflag = 0;
    char *substring;

    // usage from instructions in case of error
    static char usage[] = "usage: mywords [-cs] [-f substring] filename";  

    // only f flag requires additional input
    while ((c = getopt(argc, argv, "csf:")) != -1)
        switch (c) {
            case 'c':
                cflag = 1;
                break;

            case 's':
                sflag = 1;
                break;

            case 'f':
                fflag = 1;
                printf("Before assigning to substring\n");
                substring = optarg;
                printf("After\n");
                break;

            case '?':
                err = 1;
                break;
        }

    if (fflag = 1) {
        printf("%c ", &substring);
    }
}

Затем я запишу что-то подобное в командную строку после того, как запустил свой make-файл (который успешно работает без ошибок):

    mywords -f test

и в идеале вывод будет

    test

Операторы printf, которые я имею в fflag, - это простые тестовые распечатки, чтобы увидеть, достиг ли я даже этого.Заранее благодарю за помощь.

РЕДАКТИРОВАТЬ

Исправлено.У Дэвида Коллинза был правильный ответ.Большое спасибо всем

1 Ответ

0 голосов
/ 09 июня 2018

Я заметил три проблемы в вашем коде.(Могут быть и другие небольшие проблемы, но я думаю, что решение следующих вопросов должно помочь вам в работе.)

Проверка на равенство

Вы должны использовать if (fflag == 1) вместо if (fflag = 1).

Указатель разыменовывается

Если вы хотите получить значение символа, на который указывает substring, вы должны использовать *substring вместо &substring.

НоВы, вероятно, не хотите этого делать.См. Ниже.

printf() спецификаторы формата

При печати массива строк / символов используйте спецификатор %s вместо %c.(%c для одиночных символов).Таким образом, вы должны иметь

if (fflag == 1) {
    printf("%s ", substring);
}

Или - проще - просто

if (fflag) {
    puts(substring)
}

, поскольку любое ненулевое значение оценивается как истинное в C (и вы инициализируете fflag в ноль вначало вашей программы).

...