5

大家好,我试图分配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);
4

5 回答 5

8

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

*protoName = "HOPOPT";

protoName = "HOPOPT";

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

您还需要将sprintf呼叫更改为

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

%s格式说明符表示您将传递一个指向 nul 终止数组char的指针。 为您提供;*protoName指向的第一个字符的字符代码 不知道这一点,因此将该字符代码视为要读取的数组的地址。您不拥有此内存,因此从中读取的效果将是不确定的;很可能会发生崩溃。protoNamesprintf

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

于 2013-08-28T15:46:45.580 回答
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";
于 2013-08-28T15:46:34.190 回答
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));
}
于 2013-08-28T16:09:00.527 回答
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);
于 2013-08-28T15:47:25.313 回答
1

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

char* 原型名称;
if(h->extended_hdr.parsed_pkt.l3_proto==0){
   protoName = strdup("HOPOPT");    
}
否则如果(h->extended_hdr.parsed_pkt.l3_proto==1){
  protoName = strdup("ICMP");  
...
全部字符[500];
sprintf(all,"IPv4','%s'",* protoName);
免费(原型名称);
于 2013-08-28T15:58:00.807 回答