C将字符串插入char指针

时间:2013-08-28 15:45:30

标签: c string

大家好我尝试将string分配到char *指针。以下是我的工作方式,但我收到了警告: assignment makes integer from pointer without a cast.

在C中处理字符串的正确原因是什么?

char* protoName = "";

if(h->extended_hdr.parsed_pkt.l3_proto==0)
    *protoName = "HOPOPT";  
else if(h->extended_hdr.parsed_pkt.l3_proto==1)
    *protoName = "ICMP";    
else if(h->extended_hdr.parsed_pkt.l3_proto==2)
    *protoName = "IGMP";    
else if(h->extended_hdr.parsed_pkt.l3_proto==3)
    *protoName = "IGMP";    
else if(h->extended_hdr.parsed_pkt.l3_proto==4)
    *protoName = "IGMP";

char all[500];

sprintf(all,"IPv4','%s'",* protoName);

5 个答案:

答案 0 :(得分:8)

如果您只想更改哪个字符串文字protoName指向,则只需更改

*protoName = "HOPOPT";

protoName = "HOPOPT";

*protoName =尝试写入protoName指向的第一个字符。这不适用于您的情况,因为protoName指向无法修改的字符串文字。

您还需要将sprintf来电更改为

sprintf(all,"IPv4','%s'", protoName);

%s格式说明符表示您将传递指向以nul结尾的char数组的指针。 *protoName为您提供protoName指向的第一个字符的字符代码; sprintf不知道这一点,所以会将该字符代码视为要读取的数组的地址。你没有这个记忆,所以读取它的效果是不明确的;很可能会崩溃。

顺便说一句,如果你有一个可写的char数组并希望更改其内容,则需要使用strcpy将新的字符数组复制到其中。

答案 1 :(得分:2)

如果使用常量,则只需重新指定指针,而不是内容:

const char* protoName = "";
if(h->extended_hdr.parsed_pkt.l3_proto==0)
    protoName = "HOPOPT";    
else if(h->extended_hdr.parsed_pkt.l3_proto==1)
    protoName = "ICMP";  
else if(h->extended_hdr.parsed_pkt.l3_proto==2)
    protoName = "IGMP";  
else if(h->extended_hdr.parsed_pkt.l3_proto==3)
    protoName = "IGMP";  
else if(h->extended_hdr.parsed_pkt.l3_proto==4)
    protoName = "IGMP";

答案 2 :(得分:2)

以下是一些例子:

#include <stdio.h>

const char * protoNameFromPktId(int id) {
    static char* protoName[] = { "HOPOPT", "ICMP", "IGMP", "IGMP","IGMP"};
    return protoName[id];
}

main() {
   printf("%s\n", protoNameFromPktId(2));
   char all[500];
   sprintf(all,"%s", protoNameFromPktId(2));
   strcpy(all, protoNameFromPktId(2));
}

答案 3 :(得分:1)

你只需要这样做: -

protoName = "HOPOPT"; 

而不是

*protoName = "HOPOPT";

所以改变如下: -

char* protoName = "";
  if(h->extended_hdr.parsed_pkt.l3_proto==0)
  protoName = "HOPOPT";    
  else if(h->extended_hdr.parsed_pkt.l3_proto==1)
  protoName = "ICMP";  
  else if(h->extended_hdr.parsed_pkt.l3_proto==2)
  protoName = "IGMP";  
  else if(h->extended_hdr.parsed_pkt.l3_proto==3)
  protoName = "IGMP";  
  else if(h->extended_hdr.parsed_pkt.l3_proto==4)
  protoName = "IGMP";

  char all[500];
    sprintf(all,"IPv4','%s'",* protoName);

答案 4 :(得分:1)

我可以看到的主要问题是你没有为字符串绑定内存,所以你必须使用malloc或更好地使用strdup自动分配内存的函数。因为如果您分配了大字符串,那么您应该遇到问题。 警告的问题由其他人回答,所以没关系。如果我错了,请纠正我。

char* protoName;
if(h->extended_hdr.parsed_pkt.l3_proto==0){
   protoName = strdup("HOPOPT");    
}
else if(h->extended_hdr.parsed_pkt.l3_proto==1){
  protoName = strdup("ICMP");  
...
char all[500];
sprintf(all,"IPv4','%s'",* protoName);
free(protoName);