проблема ввода строкового буфера - PullRequest
0 голосов
/ 07 августа 2020

У меня есть простая процедура сравнения строк. Недавно добавлен строковый ввод с клавиатуры, но что-то не так. Функция "cmp (" ala ", dict);" работает нормально. Я подозреваю, что проблема с нулевым завершением связана со строками в целом или с несовместимостью длины буфера.

Поисковый ввод "ala" не возвращает совпадений. Но (после комментирования ненужного кода) это нормально "cmp (" ala ", dict);"

Это код.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char *MyText[256];
char **dictionary()
{
    char **dict = (char**)malloc(sizeof(char*) * 5);
    int i = 0;
    for(i = 0; i < 5; i++)
        dict[i] = (char*)malloc(sizeof(char) * 7);
    strcpy(dict[0], "mark");
    strcpy(dict[1], "ala");
    strcpy(dict[2], "wojtek");
    strcpy(dict[3], "tom");
    strcpy(dict[4], "john");
    
    return (dict);
}
void free_dictionary(char **dict)
{
    for (int i = 0; i < 5; i++)
        free(dict[i]);
    free(dict);
}

int cmp(char *s1, char *s2[5])
{
    int i = 0;
    int n = 0;
  
    for (i = 0; i < 5; i++)
        if (strcmp(s1, s2[i]) == 0) {
            
            n++;
            
        }
    if (n > 0)
        printf("Found %d", n);
    else
        printf("Nothing found");
}

int main(int argc, char *argv[])
{

    char BufText[255];
    int n=0;
    char sign;
    fflush(stdin);
    printf("Give me names: \n");
    n = 0;
    do {
        sign = getchar();
        BufText[n ++] = sign;
        if(n >= 253) break;
    } while (sign !='\n');
    BufText [n] = 0;
    char **dict = dictionary();
    cmp(BufText, dict);
    free_dictionary(dict);
    return 0;
}

1 Ответ

0 голосов
/ 07 августа 2020

Пользовательский ввод сохраняется с символом ' \n'. Следовательно, сравнение строк не будет совпадать, т.е. "ala" не соответствует "ala\n".

Проверьте '\n' перед добавлением в буфер, чтобы избежать сохранения символа новой строки.

For пример:

n = 0;
do {
    sign = getchar();
    if (n >= 253) break;
    if (sign =='\n') break;
    BufText[n ++] = sign;
} while (1);
BufText [n] = 0;

или в более компактном виде:

n = 0;
while (n < 253 && (sign = getchar()) != '\n') BufText[n ++] = sign;
BufText [n] = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...