【问题标题】:Exception when trying to copy the data into a char pointer value尝试将数据复制到 char 指针值时出现异常
【发布时间】:2016-02-18 13:24:22
【问题描述】:

我是 C 的新手。我有这个打印语句,其中打印了特定的值。我需要将此值复制到字符串中。但是当我尝试复制它时,我得到了下面显示的异常。

Unhandled exception at 0x00007FFCF01CB20A (msvcr120d.dll) in RFIDTest.exe: 0xC0000005: Access violation reading location 0x000000000000E200.

下面是打印语句,我需要把它的输出放入一个变量中。

printf("%04X", (((epc[i] & 0xFF00) >> 8) | ((epc[i] & 0xFF) << 8)));

下面显示的是我如何尝试将它放入变量并附加它。

strcat(("%04X", (((epc[i] & 0xFF00) >> 8) | ((epc[i] & 0xFF) << 8))),strData);

我的完整方法如下。

char* ipj_util_print_epc(uint16_t* epc, int len, bool little_endian)
{
char * strData="";
int i;
for (i = 0; i < len; i++)
{
    /* Print hyphen every two bytes */
    if (i % 1 == 0 && i > 0)
    {
        printf("-");
        strcat("-",strData);
    }
    /* Print one byte at a time */
    if (little_endian)
    {
        printf("%04X", (((epc[i] & 0xFF00) >> 8) | ((epc[i] & 0xFF) << 8)));
        strcat(("%04X", (((epc[i] & 0xFF00) >> 8) | ((epc[i] & 0xFF) << 8))),strData);
    }
    else
    {
        strcat(("%04X", epc[i]),strData);
        printf("%04X", epc[i]);
    }
}
printf("\n");
return strData;
}

如果我做错了,我怎样才能将这些值打印到变量中?

【问题讨论】:

  • 一些 int % 1 怎么可能是 != 0 ?
  • 是的,感谢您发现它。请帮我解决这个例外:(

标签: c string exception char append


【解决方案1】:
 strcat("-",strData);

strcat 将第二个字符串附加到第一个字符串。

在这里您尝试修改字符串文字 "-" ,它是常量。也许您想将 - 添加到 strData ,那么它应该是 strcat 的第一个参数。

你还声明strData为-

char * strData="";

它也是一个字符串文字。所以你需要这样做,你将可以修改它的内容-

char * strData;
strData=malloc(len);                // any desired length 

【讨论】:

  • 即使在更改了诸如 strcat(strData,"-"); 这样的元素之后和 strcat(strData,("%04X", (((epc[i] & 0xFF00) >> 8) | ((epc[i] & 0xFF)
  • @mayooran 您还需要在strcat 之前为strData 分配内存。
  • 我现在也添加了 malloc。仍然收到错误。真的可以附加到 char * 吗?还是我需要的 char 数组?
  • @mayooran 你不能做strcat(strData,("%04X", (((epc[i] &amp; 0xFF00) &gt;&gt; 8) | ((epc[i] &amp; 0xFF) &lt;&lt; 8))));,你必须使用sprintf
  • @mayooran 在你的strcat 你也传递格式说明符,为什么?
【解决方案2】:

结合其他人的建议,你的功能应该是:

char* ipj_util_print_epc(uint16_t* epc, int len, bool little_endian)
{
    char *strData = malloc(len*4+(len+1)/2+1);  // 4 chars per uint16, hyphens and terminating \0
    int i;
    char *bufp= strData;
    strData[0]= '\0';
    for (i = 0; i < len; i++)
    {
        /* Print hyphen every two bytes */
        if (i % 2 == 0 && i > 0)
        {
            printf("-");
            strcat(bufp,"-");
            bufp++;
        }
        /* Print one byte at a time */
        if (little_endian)
        {
            printf("%04X", (((epc[i] & 0xFF00) >> 8) | ((epc[i] & 0xFF) << 8)));
            bufp += sprintf(bufp,"%04X", (((epc[i] & 0xFF00) >> 8) | ((epc[i] & 0xFF) << 8))));
        }
        else
        {
            bufp += sprintf(bufp,"%04X", epc[i]));
            printf("%04X", epc[i]);
        }
    }
    printf("\n");
    return strData;
}

【讨论】:

  • 您在 sprintf 中混合了最后 2 个参数,如果源缓冲区和目标缓冲区重叠,这是未定义的行为。
  • @mch,感谢您发现 sprintf 参数中的错误。修复。尽管源和目标重叠,但最终效果是追加,或者实际上是将 strData 复制到自身上然后追加。
  • 为了满足任何 UB 专家,我修改了解决方案以避免 sprintf 的源和目标重叠。
  • 仍然没有帮助。在声明strData时,char *strData = malloc(len * 4 + (len + 1) / 2 + 1);它说 :(
  • 我必须将其设置为空字符串。现在它起作用了。谢谢
猜你喜欢
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 2016-04-16
相关资源
最近更新 更多