【发布时间】:2020-03-13 06:08:24
【问题描述】:
我正在制作一个游戏,其中答案存储在 client_challenges->answer 中,而客户端以以下格式输入答案(存储在缓冲区中):
A: myanswer
如果答案从字母 A 开始,那么我需要将 myanswer 与预先存储的答案进行比较。使用下面的代码,我得到了正确的缓冲区和 ans 长度,但是如果我打印出我的存储数组和答案数组,结果会有所不同。例如,如果我输入 A:color,我的商店会给出 colo 而不是 color。但是,store-2 在某些情况下有效。我该如何解决这个问题?
if (buffer[0] == 'A')
{
printf("ans len %ld, buff len %ld\n",strlen(client_challenges->answer,(strlen(buffer)-4));
if(strlen(client_challenges->answer) == (strlen(buffer)-4))
{
char store[100];
for (int i = 1; i<= strlen(client_challenges->answer);i++)
{
store[i-1]=buffer[2+i];
}
store[strlen(store)-2] = '\0';
//store[strlen(client_challenges->answer)+1]='\0';
printf("Buffer: <%s>\n", buffer);
printf("STORE: %s\n",store);
printf("ANSWER: %s\n",client_challenges->answer);
if(strcmp(store,client_challenges->answer)==0)
{
send(file_descriptor, correct, strlen(correct), 0);
}
}
}
示例: 客户进入
A: Advancement
ans len 11, buff len 11
但是当我打印出商店时,它是Advancemen,而答案是Advancement。但是,在我之前的尝试中,答案很快,我输入了“很快”。那时它起作用了。
【问题讨论】:
-
我不知道您是如何填充缓冲区的。但也许有时你在结尾有一条新线,有时你没有?也许你需要知道你之前的最后一个字符是什么
store[strlen(store)-2] = '\0'; -
@JerryJeremiah 我正在使用这个:valread = read(file_descriptor, buffer, 1024);在命令行上,我只需输入 A: color 然后在所有情况下都按回车键。然后服务器会告诉我我是否错了。
-
不确定这是如何编译的,第一个 strlen 后缺少 ):printf("ans len %ld, buff len %ld\n",strlen(client_challenges->answer),(strlen (缓冲区)-4));
-
建议的
printf()包含标记字符<>。"<A: Many"报告似乎是错误的。store带有哨兵的输出会有所帮助,而不仅仅是"Many?"。建议在if (buffer[0] == 'A')之前,代码使用buffer[strcspn(buffer, "\r\n")] = 0;来消除行尾并相应地调整偏移量。祝你好运。
标签: c string algorithm sockets strlen