gpt4 book ai didi

c - strncmp 正确使用

转载 作者:太空狗 更新时间:2023-10-29 16:55:57 26 4
gpt4 key购买 nike

这是快速背景:我有一个客户端程序和一个服务器程序,它们通过 Unix 套接字相互通信。在服务器端解析收到的消息时,我试图使用 strncmp 来确定要采取的操作。

我遇到的问题是弄清楚 strncmp 的长度参数究竟使用什么。这是有问题的原因是我的一些消息共享一个公共(public)前缀。例如,我有一条消息“getPrimary”,它使服务器响应主服务器地址,还有一条消息“getPrimaryStatus”,它使服务器响应主服务器的状态。我最初的想法是执行以下操作:

if(strncmp(message,"getPrimary",strlen("getPrimary"))==0){
return foo;
}
else if(strncmp(message,"getPrimaryStatus",strlen("getPrimaryStatus"))==0){
return bar;
}

问题是当我向服务器发送“getPrimaryStatus”时,代码将始终返回 foo,因为 strncmp 没有在字符串中检查得足够远。我可以将 strlen(message) 作为长度参数传递给 strncmp,但这似乎违背了使用 strncmp 的目的,即防止在意外输入的情况下溢出。对于我可以读取的最大消息长度,我确实有一个静态变量,但似乎将其传入,因为长度只是确保如果消息溢出,影响会最小化。

我想出了一些解决方案,但它们不是很漂亮,所以我想知道是否有一种通用的方法来处理这个问题。

作为引用,我目前的解决方案是:以这样的方式对我的 if/else if 语句进行排序,即按长度递减的顺序检查任何具有公共(public)前缀的消息(这似乎是一种非常好的方法,可以在我的代码中为以后尝试向其中添加内容的任何人 throw 地雷) ).

将我的具有共同前缀的消息分组在一起,然后先查找后缀:

if(strncmp(message,"getPrimary",strlen("getPrimary"))==0){
if(strncmp(message,"getPrimaryStatus",strlen("getPrimaryStatus"))==0){
return bar;
else
return foo;
}
}

但这感觉很乱,特别是因为我正在处理大约 20 条不同的可能消息。

创建一个我拥有的所有可能消息的数组,向我的初始化序列添加一个函数,该函数将按长度降序对数组进行排序,并让我的代码搜索该列表的元素,直到找到匹配项。这看起来既复杂又愚蠢。

这似乎应该是一个足够普遍的问题,应该在某个地方找到解决方案,但到目前为止我还没有找到任何东西。

在此先感谢您的帮助!

最佳答案

假设 message 中的字符串应该以 null 结尾,唯一的原因是在这里使用 strncmp() 而不是 strcmp() 是为了防止它查看 message 的末尾,在 message 不是 空终止。

因此,您传递给 strncmp()n 应该是接收到的 message 的大小,您应该知道(来自读取消息的 read()/recv() 函数的返回值。

关于c - strncmp 正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4342012/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com