字符串缓冲区输入问题
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;
我有简单的字符串比较例程。最近添加了字符串键盘输入,但是出了点问题。函数“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;