-1

编辑:

再一次,我将尝试更准确地解释它。

我正在编写 IRC 客户端 - 基于套接字的网络应用程序。使用函数从服务器接收数据recv()并将它们一个字符一个字符地存储在rBuf[]数组中。
然后将它们复制到rBufh[]传递给解析函数的数组中。
重要的是服务器一次只发送一个字符[一个字符在一个recv()中]和键(存储在两个dim.array []中的字符数组key1)是字符串,如果解析方法在接收到的数据中找到其中一个它需要根据协议文档中指定的 3 位代码做出正确反应。- 至于基础。

解析算法/函数的工作原理如下:

  1. key1(包含键)和rBufh 数组是传递给它的参数
  2. 获取存储的第一个字符串的第一个字符key1并将其与第一个字符进行比较rBufh
  3. 如果它们匹配返回int ret = 2(这意味着“在收到的数据中找到了部分密钥”

现在recv()将一个字符(因为服务器每次只发送字符)添加到rBufh数组中,该数组再次传递给解析函数,算法再次开始,直到找到匹配的键,返回int ret = 1(找到匹配的键)或者int ret = 0如果在第 3 步中他们没有匹配。

在解析器工作时,停止打印到标准输出并根据解析器打印返回的值停止较长时间(如果key1找到数组中的一个键的一部分)或允许打印(如果已找到整个键或解析器无法将rBufH数组中传递给它的字母与存储在key1) 中的任何键匹配

我们越来越接近理解我的要求 - 我希望:)

存储在数组中的字符串数量key1是事先知道的,因为它们在协议文档中指定。因此可以在定义时立即对其进行初始化。

我问的是:

是否可以传递给key1(不一定像我那样使用 sprintf - 它看起来很方便)字符串,该字符串将包含代码的某些部分,意思是“任何三位数字”。

例如
,让上面 3 行提到的代码部分用 XXX 标记

key1[0] = "irc2.gbatemp.net XXX nickname"

现在,如果解析器遇到任何与 key1[0] 匹配的字符串,其中包含任意三位数代替 XXX,它将返回 1 - 因此其他函数将有可能做出正确反应。

这样我就不必在key1数组中存储许多具有不同 XXX 值的字符串,而只需一个可以匹配所有字符串的字符串。


好的,现在我真的尽力帮助您理解它并获得答案:)

问候
汤姆

附言

随意更改此主题的标题,因为我真的不知道应该如何用您已经注意到的几句话来描述这个问题。(之所以如此,是因为我的第一个想法是将一些正则表达式传递给key1

4

2 回答 2

1

如果您只想在字符串中插入任意 3 位数字,请执行以下操作:

int n = 123; // some integer value that you want to represent as 3 digits
sprintf(key1[1], ":irc2.gbatemp.net %03d %s ", n, nickname);

请注意,%03d格式说明符不是正则表达式 - 它只是指定整数参数将显示为 3 位十进制值,如果需要,前导零。

于 2012-05-11T21:22:19.463 回答
0

你不能告诉编译器。签名是

int sprintf ( char * str, const char * format, ... );

编译器不查看格式字符串内部,甚至不确保您匹配您的 %d、%s 和 int、char* 。这必须是运行时的。就像

int printKey(char* key, int n) {
    if(!(0 <= n && n <= 999)) { 
        return -1; //C-style throw an error
    }
    sprintf(key, ":irc2.gbatemp.net %d %s", n, nickname);
    return 0;
}

也使用 snprintf 而不是 sprintf 或者你要求内存问题。

于 2012-05-11T21:25:20.490 回答