Новичок здесь. Проблема с функцией C во время исполнения - PullRequest
0 голосов
/ 11 мая 2019

Редактировать: Поскольку я понимаю, что мне нужно предоставить больше информации, чтобы вам было понятно, ребята, я добавил основную функцию и выбор getcho, а также два образа работающей программы.Моя проблема в том, что после ввода конечного слова я хочу сначала увидеть меню, а затем сделать выбор, в то время как он запрашивает ввод без отображения меню.

Эта функция является частью большой программы,но здесь возникает проблема.Он считывает введенные слова, помещает их в массив, пока не будет введено ключевое слово **** END.Однако, когда вводится это ключевое слово, оно сразу не входит в указанное предложение if (вы увидите это в коде).Я новичок, и это может быть чем-то действительно очевидным, но любая помощь очень ценится.

#include <string.h>

#define M 50
#define N 15

void getText(char a[M][N])
{
    int i, j;
    char temp[N];
    for (i = 0; i < 50; i++) {
        for (j = 0; j < 15; j++) {
            if (i == 49 && j == 14) {
                printf("Maximum length of text reached.\n");
            }

            scanf("%s\n", temp);

            if (strcmp(temp, "****END") == 0) {
                printf("You entered the endkey.\n");
                return;
            }

            strcpy(a[i], temp);
        }
    }
}

int main(){

int input;

while(1){
    input = getChoice();

    if(input == 1){
        getText(text);
    }

    else if(input == 2){
        getDictionary();
    }

    else if(input == 3){
        correctText();
    }

    else if(input == 4){
        saveText();
    }

    else if(input == 5){
        getStats();
    }

    else if(input == 6){
        break;
    }

}


return 0;
}

int getChoice(){
    int temp;
printf("Choose function:\n1: Enter text\n2: Enter dictionary\n3:     Correct  text\n4: Save text\n5: Get text statistics\n6: Exit program\n");
scanf("%d", &temp);
return temp;
}

Введено конечное слово, и теперь оно ждет ввода вместо отображения меню.

Я ввел 2 для второй функции программы, затем он показал меню и перешел к функции 2.

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Помимо ненужного двойного вложенного цикла, эта строка

scanf("%s\n", temp);

должно быть

scanf("%s", temp);

Обычно не следует пытаться сопоставить конечные пробелы с scanf, а спецификатор формата %s автоматически отфильтровывает начальные пробелы (но учтите, что %c этого не делает).

Существуют и другие ошибки, и представленный код изначально был неполным, но, в частности, длина ввода для %s должна быть ограничена во избежание переполнения буфера.

0 голосов
/ 11 мая 2019
#include <stddef.h>  // size_t
#include <ctype.h>   // isspace()
#include <stdio.h>   // scanf(), puts()
#include <string.h>  // strcmp()

// see /1893437/strifikatsiya-znacheniya-makrosa
#define STRINGIFY(x) #x
#define STRING(x) STRINGIFY(x)

#define LINES 50
#define COLS 15

char const *end = "****END";

// throw away everything until a newline is found
void clear(FILE *stream)
{
    int ch;
    while ((ch = getc(stream)) != EOF && ch != '\n');
}

size_t getText(char dst[LINES][COLS + 1])
{
    size_t i = 0;
    for (; i < LINES; i++) {
        char temp[COLS + 1] = { 0 };
        scanf("%" STRING(COLS) "s", temp);  // "%15s" at runtime.

        int ch;
        // if the next character is not whitespace ...
        if ((ch = getchar()) != EOF && !isspace(ch)) {
            puts("Warning: Input too long, was truncated!");
            clear(stdin);
        }

        if (strcmp(temp, end) == 0) {
            puts("You entered the endkey.");
            return i;
        }

        strcpy(dst[i], temp);
    }
    return i;
}

int main(void)
{
    // COLS + 1 ... we need space for the terminating newline character.
    char foo[LINES][COLS + 1];
    size_t n = getText(foo);

    for (size_t i = 0; i < n; ++i)
        puts(foo[i]);
}

Никогда не следует использовать спецификатор преобразования %s без указания ширины для ограничения сохраняемых символов:

char foo[10];
scanf("%9s");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...