C 将字符数组中的字符放入字符串中,直到找到特定字符为止

C 将字符数组中的字符放入字符串中,直到找到特定字符为止,c,arrays,string,C,Arrays,String,我想要一种可靠的方法从字符数组中读取字符并将其放入字符串中。这将一直发生,直到找到\r。我可以遍历数组,但没有好的方法将其放入字符串中。我不敢使用malloc,因为有时会将垃圾值放入字符串中 这里的payload是来自TCP数据包的HTTP数据\r\n\r\n表示有效负载的结束 到目前为止,我的代码将遍历字符数组: void print_payload(const unsigned char *payload, int len) { int i; const u

我想要一种可靠的方法从字符数组中读取字符并将其放入字符串中。这将一直发生,直到找到
\r
。我可以遍历数组,但没有好的方法将其放入字符串中。我不敢使用
malloc
,因为有时会将垃圾值放入字符串中

这里的
payload
是来自TCP数据包的
HTTP
数据<代码>\r\n\r\n表示有效负载的结束

到目前为止,我的代码将遍历字符数组:

void print_payload(const unsigned char *payload, int len) {

        int i;
        const unsigned char *ch = payload;

        for (i = 0; i < len; i++) {
                if (strncmp((char*) ch, "\r\n\r\n", 4) == 0) {
                        // Indicates end of payload data.
                        break;
                } else if (strncmp((char*) ch, "\r\n", 2) == 0) {
                        //Indicates EOL
                        printf("\r\n");
                        ch++;
                        i++;
                } else if(strncmp((char*) ch, "Host:", 5) == 0){
                        printf("Host: ");
                        const unsigned char *del = ch + 6;
                        int i = 0;
                        while (del[i] != 13 ){   
                           /* 
                            *13 is decimal value for '\r'.
                            * The characters below are to be inserted
                            * in a string. Not sure how though.
                            */

                                printf("%c",del[i]);
                                i++;
                        }
                } else if(strncmp((char*) ch, "User-Agent: ", 11) == 0){
                        /*
                         * It has to implemented here as well.
                         * And in every case where my string matches.
                         */
                        printf("UserAgent: ");
                        const unsigned char* del = ch + 11;
                        int i = 0;
                        while(del[i] != 13){
                                printf("%c")    
                        }

                }                
                ch++;
        }

        printf("\r\n\r\n");
        printf("\n");

        return;
}
void print_有效载荷(常量无符号字符*有效载荷,整数长度){
int i;
const unsigned char*ch=有效载荷;
对于(i=0;i

有人能帮我做到这一点吗?我知道这是基本的,但我仍在学习C编程,不知道如何做到这一点。提前感谢。

您有几个选择。首先,如果您可以限制字符串的大小,并且在函数外部不需要它,那么char数组就可以工作:

#define STRING_MAX_LEN 999//chux mentions this is better then just putting "1000" in the array[] - 1000 needs to make sense in terms of the program, or something you wish to enforce (and checked!)
char newString[STRING_MAX_LEN+1] = {0};//Initialize to NULL value.
但是,没有理由害怕
malloc
——只要记住安全自由地工作,你就应该没事了:

char *newString = malloc(sizeof(char)*(len+1)); //Better limit on needed space - +1 for a final '\0'.
if (!newString) //Oh no! hard fail.
    //do Something
}
memset(newString,0,sizeof(char)*(len+1)); //No garbage in my new string anymore!
...
...
free(newString);
//Finish up with program
您甚至不必附加一个
“\0”
-您已经确定缓冲区中已满了它们,因此您需要一个有效的C字符串。注意
sizeof(char)
可能是多余的,但我还是想保留它,以防有一天它不等于1

注意:如果出于某种原因必须返回新字符串,则必须使用动态分配的数组,使用
malloc
。最后,如果一次只需要检查/保留一个子字符串,则最好重新使用相同的字符串。

void print\u有效载荷(const unsigned char*payload,int len)
void print_payload(const unsigned char *payload, int len) 
{
    int i;
    char c;
    char *p;

    p = (char*)payload;
    for(i=0;i<len;i++) {
        if(!strncmp(&p[i],"\r\n\r\n",4)) {
            c = p[i+4];
            p[i+4] = 0;
            break;
        }
    }
    if(i==len) {
        return;
    }
    printf("%s\n",p);
    p[i+4] = c;
}
{ int i; 字符c; char*p; p=(char*)有效载荷;
对于(i=0;i
strncmp((char*)ch,“\r\n\r\n”,4)
,在代码的第一部分没有什么意义。
ch
的状态是未知的。如果没有调用代码或调用
print\u payload()
的更深层限制,代码就没有什么意义。发布一个。`@chux My bad sir。我会立即编辑并更正它。
而[i] !=13){printf(“%c”)}
您应该使用
'\r'
而不是数字。还请提供实际编译的代码。缺少一个
。最后:此循环将永远运行,因为
i
永远不会更改。如果它会更改,如果您之前找不到
'\r'
终止符,您可以在
'\r'
终止符后面运行。
*1000
是一个模糊的概念。实际上,您是说分配足够大,所以代码不必担心。健壮的代码确实会担心,而且无论值是什么,都需要测试以确保不溢出。@chux我不想添加太多虚构的词,但我将使用define来明确它。您必须知道或强制执行一个硬限制。@chux Edit如果我想要一个硬编码的限制,我可能会做一些类似的事情。@kabanus这是一个很好的机制。谢谢。但我也必须在其他
情况下实现它,如果
情况也是如此。我应该为每种情况创建新的
字符数组
,还是使用相同的数组并将其复制到新的字符串变量中进一步处理?@DevanshuMisra取决于用例。如果您一次只需要保存一个数组,请使用同一个数组。处理完后,只需将第一个字符设置为
\0
,以便将其标记为空字符串,并记住在填充完后将结束字符追加。如果需要返回字符串,则必须使用
malloc
,因为数组只是本地分配的对象。。