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;istrncmp((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
,因为数组只是本地分配的对象。。