如何在char数组C中使用正则表达式

时间:2012-05-11 21:14:29

标签: c regex arrays expression

编辑:

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

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

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

  1. key1(包含键)和rBufh数组是传递给它的参数
  2. 获取存储在key1中的第一个字符串的第一个字符,并将其与rBufh
  3. 的第一个字符进行比较
  4. 如果匹配返回int ret = 2(表示已在收到的数据中找到“部分密钥”
  5. 现在recv()添加一个char(因为服务器每次只在char上发送)到rBufh数组,再次传递给解析函数,算法再次启动,直到找到匹配的键,返回int ret = 1(找到匹配的密钥)或int ret = 0如果在步骤3中它们不匹配。

    当解析器工作时,打印到stdout是停顿的,并且基于解析器打印返回的值要么停止更长时间(如果找到key1数组中的一个键的一部分)或者允许打印(如果找到整个密钥或解析器无法将rBufH数组中传递给它的字母与key1中存储的任何密钥匹配)

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

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

    我问的是:

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

    e.g。
    让XXX标记上面提到3行的代码部分

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

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

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


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

    问候
    汤姆

    P.S。

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

2 个答案:

答案 0 :(得分: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位十进制值,如果需要则带前导零。

答案 1 :(得分:0)

你无法告诉编译器。签名是

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

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

一样
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,或者你要求内存麻烦。