【发布时间】:2019-10-27 23:09:44
【问题描述】:
有什么方法可以将整数放入已知大小的字符串中,如果可以,我该如何读取它?例如将 (int a=10) 转换为 (char string[200])。
【问题讨论】:
-
您能否澄清您的问题,您是否尝试将 10 转换为字符串“10”,然后将其添加到您的 char 数组或将二进制表示形式放入您的字节数组中?
有什么方法可以将整数放入已知大小的字符串中,如果可以,我该如何读取它?例如将 (int a=10) 转换为 (char string[200])。
【问题讨论】:
有什么方法可以将整数放入已知大小的字符串中,如果可以,我该如何读取它?例如将 (
int a=10) 转换为 (char string[200])。
是的,有使用printf的字符串版本
snprinf(string,200,"%d",a);
如果您想手动执行上述操作,也可以使用 div 和 mod 10 的循环生成字符串。 查看另一个答案以获取此示例https://stackoverflow.com/a/49615617/391691
要从字符串sscanf、atoi 或atol 中取回您的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 将代表这个问题的另一种解释,您只需将原始数据存储在 char 数组中——此时它不是字符串。
有什么方法可以将整数放入已知大小的字符串中,如果可以,我该如何读取它?例如将 (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_t、uint32_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”是按原样写的。
【讨论】:
char 数组字符串转换为 int* 来做到这一点。 不,您不能安全地这样做。 (*(int*)(&string[pos])) = to_insert; 违反 [严格别名规则](stackoverflow.com/questions/98650/… 并且还可能根据 6.3.2.3 Pointers, paragraph 7 调用未定义的行为:“指向对象类型的指针可能会转换为指向不同对象类型的指针。如果结果指针不是正确对齐68) 对于引用的类型,行为未定义。"
SIGBUS ARM
sizeof(integer) 或插入该 int 的位置。我确实知道我的回答可能会在不同系统上导致未定义的行为,但它会尝试完全按照作者的要求去做。