strncmp正确用法

Jor*_*lls 9 c

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

我遇到的问题是确切地想知道strncmp的长度参数使用了什么.这是有问题的原因是我的一些消息共享一个共同的前缀.例如,我有一条消息"getPrimary",它使服务器响应主服务器地址和消息"getPrimaryStatus",这会导致服务器响应主服务器的状态.我最初的想法是做以下事情:

if(strncmp(message,"getPrimary",strlen("getPrimary"))==0){
    return foo;
}
else if(strncmp(message,"getPrimaryStatus",strlen("getPrimaryStatus"))==0){
    return bar;
}
Run Code Online (Sandbox Code Playgroud)

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

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

作为参考,我目前的解决方案是:以这样的方式命令我的if/else if语句,以便按照长度递减的顺序检查具有公共前缀的任何消息(这似乎是在我的代码中为任何人抛出地雷的一种非常好的方法试图稍后添加一些东西).

将我的消息与公共前缀组合在一起并首先查找后缀:

if(strncmp(message,"getPrimary",strlen("getPrimary"))==0){
    if(strncmp(message,"getPrimaryStatus",strlen("getPrimaryStatus"))==0){
        return bar;
    else
        return foo;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

创建一个包含我所有可能消息的数组,向我的init序列添加一个函数,该函数将按降序长度对数组进行排序,并让我的代码搜索该列表的元素,直到找到匹配为止.这看似复杂而愚蠢.

看起来这应该是一个普遍的问题,应该在某个地方找到解决方案,但到目前为止我还没有找到任何东西.

在此先感谢您的帮助!

caf*_*caf 5

假定该字符串中message认为是空值终止的,唯一的理由使用strncmp()而不是在这里strcmp()将是防止它寻找超越的结束message,在的情况下message不是空值终止。

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

  • 我认为将消息大小传递给 strnmp 并不是解决您问题的不完整解决方案。详情请参阅我的解决方案。 (2认同)