1

只是弄乱了我目前正在开发的程序,我偶然发现了这一点。该程序属于客户端-服务器类型,因此客户端向用户询问命令,服务器执行所有执行。如果输入“退出”命令,客户端将停止。我正在使用

if (strncmp ("exit", command, strlen (command) - 1)) == 0)
{
         //Perform exit code
}

检查是否已输入“退出”。如果我输入“a”,程序就会退出,就像输入了“exit”一样。没什么大不了的,只是想知道为什么会这样。

谢谢。

4

4 回答 4

1

只需使用strcmp.

strlen("a")返回 1... 1 减 1 => 零。第三个参数为零,因此在没有对两个字符串strncmp进行任何测试的情况下达到了“最大长度” 。char

于 2013-12-02T19:26:11.317 回答
1

这是发生的情况:当您输入 时"a ",分隔命令的代码使command字符串等于"a"(无空格)。它的长度是一。然后代码调用strncmp,告诉它"exit"使用零个初始字符进行比较。这种比较总是成功的,因为根本不进行比较。

请注意,-1从表达式中删除可能无法解决问题,因为代码会在您输入时退出"e "(当然,除非这您想要实现的行为)。要确保该命令确实是"exit",您可以使用以下条件:

if ( strlen(command) == 4 && strncmp("exit", command, 4)) == 0 ) ...
于 2013-12-02T19:27:24.907 回答
0

如果输入a的长度command将是1。您是否要比较长度 - 1,所以它会是0. strncmp不会测试任何角色。

我认为commandchar[MAX_BUFFER]类型。您最好将其MAX_BUFFER作为第三个参数传递。

于 2013-12-02T19:26:43.537 回答
0

strlen(command)返回 中的非零字符数command。它不包括终止零字符。因此,strlen(command) - 1比非零字符的数量少一。当command包含“a”时,strlen(command) - 1为 0。

然后strncmp("exit", command, strlen(command) - 1)将“exit”的零个字符与 的零个字符进行比较command。比较零个字符的结果总是相等,因为空字符串等于空字符串。要解决此问题,请不要比较零字符。要么将传递给的长度更改为strncmp您想要的长度,要么strcmp用于比较整个字符串。

如果要将整个字符串“exit”与 in 中的整个字符串进行比较command,请使用:

if (strcmp("exit", command) == 0) …

如果您想允许command成为“exit”的缩写,以便“exit”接受命令“e”、“ex”、“exi”和“exit”,则使用:

if (strncmp("exit", command, strlen(command)) == 0) …
于 2013-12-02T19:44:48.753 回答