字符串缓冲区输入问题

string buffer input issue

我有简单的字符串比较例程。最近添加了字符串键盘输入,但是出了点问题。函数“cmp(”ala”, dict);”工作得很好。我怀疑一般情况下与字符串有关的零终止问题,或者某些缓冲区长度不兼容。

搜索输入“ala”returns没有命中。但是(在注释掉不必要的代码之后)这是可以的 "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;
}

用户输入以 ' \n' 字符保存。因此,您的字符串比较将不匹配,即 "ala" 不匹配 "ala\n".

在添加到缓冲区之前检查 '\n' 以避免保存换行符。

例如:

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;