【问题标题】:How can I insert an integer into a block of memory?如何将整数插入内存块?
【发布时间】:2019-10-27 23:09:44
【问题描述】:

有什么方法可以将整数放入已知大小的字符串中,如果可以,我该如何读取它?例如将 (int a=10) 转换为 (char string[200])。

【问题讨论】:

  • 您能否澄清您的问题,您是否尝试将 10 转换为字符串“10”,然后将其添加到您的 char 数组或将二进制表示形式放入您的字节数组中?

标签: c memory


【解决方案1】:

有什么方法可以将整数放入已知大小的字符串中,如果可以,我该如何读取它?例如将 (int a=10) 转换为 (char string[200])。

是的,有使用printf的字符串版本

snprinf(string,200,"%d",a);

如果您想手动执行上述操作,也可以使用 div 和 mod 10 的循环生成字符串。 查看另一个答案以获取此示例https://stackoverflow.com/a/49615617/391691

要从字符串sscanfatoiatol 中取回您的int

#include <stdio.h>
#include <stdlib.h>

void main(){
   int a;
   char string[200];


   a = 10;
   snprintf(string,200,"%d",a);
   printf("As string:%s As int:%d\n",string,atoi(string));
}

我对这个问题的解释仍然不清楚,与之前的答案相比,这代表了对该问题的另一种解释https://stackoverflow.com/a/58584291/391691

【讨论】:

  • 这就是我想要的。也可以用 memcpy 实现吗?
  • memcpy 将代表这个问题的另一种解释,您只需将原始数据存储在 char 数组中——此时它不是字符串。
  • @Stelios 如果这对您来说是正确的答案,请考虑重新表述您的问题以匹配未来读者的答案。然后我将在下面删除我的答案。
【解决方案2】:

有什么方法可以将整数放入已知大小的字符串中,如果可以,我该如何读取它?例如将 (int a=10) 转换为 (char string[200])。

在这个答案中,我使用了所述的最小问题,它没有提供有关以下任何内容的详细信息:

  • string 中整数的表示/编码
  • 应该在其上运行的架构
  • 插入整数的位置

如果这个问题是关于将整数转换为它的 ASCII 表示,answer by @Simson 就是你要找的。​​p>

C 允许您通过将 char 数组转换为 int* 来将整数“放入”[1] 到 c 样式字符串的任何位置。

// string: the array (char*)
// pos: position in the array (size_t)
// to_insert: the value to insert (int)
(*(int*)(&string[pos])) = to_insert;

但请注意:这是一种大锤方法。执行此操作时必须非常小心,否则您的代码可能会在不同平台上显示未定义的行为。例如你必须手动检查和回答:

  • 内存对齐:我会尝试将整数插入架构无法寻址的位置吗?
  • 字节序:我将这个整数写入数组的方式真的是我想要的吗?
  • sizeof(int):这个整数还适合数组吗?也许考虑使用任何固定长度的整数类型,例如uint16_tuint32_t、...
  • 可能还有更多

以下示例显示了所讨论方法的用法:

#include <stdio.h>

void insert_at_pos(char* arr, size_t pos, int to_insert){
  (*(int*)(&arr[pos])) = to_insert;
}

int main(void) {
  char string[200] = {0};
  insert_at_pos(string, 3, 10);

  //print char by char as hex
  for (size_t i=0; i < sizeof(string)/sizeof(*string); ++i){
    printf("%x ",(unsigned char)string[i]);
  }
}

运行示例:

$ ./main
0 0 0 a 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

[1]:我理解“put”是按原样写的。

【讨论】:

  • 在此示例中,您假设 int 的大小为 32 位。
  • 您可以通过将 char 数组字符串转换为 int* 来做到这一点。 不,您不能安全地这样做。 (*(int*)(&amp;string[pos])) = to_insert; 违反 [严格别名规则](stackoverflow.com/questions/98650/… 并且还可能根据 6.3.2.3 Pointers, paragraph 7 调用未定义的行为:“指向对象类型的指针可能会转换为指向不同对象类型的指针。如果结果指针不是正确对齐68) 对于引用的类型,行为未定义。"
  • (续)Google SIGBUS ARM
  • 我刚刚回答了问题的要求:“有什么方法可以将整数放入已知大小的字符串中,如果可以,我该如何读取它?”作者也没有说任何关于将整数转换为 ASCII 的内容,也没有说明sizeof(integer) 或插入该 int 的位置。我确实知道我的回答可能会在不同系统上导致未定义的行为,但它会尝试完全按照作者的要求去做。
  • 写一个关于问题的相互渗透的评论并解决指出的问题,那么这对于将来对这个问题有另一种解释的人来说是一个很好的参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 2016-04-05
  • 2012-10-25
  • 1970-01-01
  • 2011-12-15
相关资源
最近更新 更多