【问题标题】:How to scan values into an array using a generic void pointer?如何使用通用 void 指针将值扫描到数组中?
【发布时间】:2023-03-23 22:03:01
【问题描述】:

给定方法头

void scanArray(void *arr, int const numElements, int const sizeElement, char const *fmt)

其中*arr可以是array的任意类型,numElements是数组中元素的数量,sizeElement是数组中值类型的大小,fmt%d%lf%f 等字符串,如何编写使用 scanf 将值插入数组的函数?

【问题讨论】:

标签: c arrays pointers generics scanf


【解决方案1】:
void scanArray(void *arr, int const numElements, int const sizeElement, char const *fmt){
  int i;
  unsigned char *tempArr = (unsigned char*) arr;
  for(i=0; i<numElements; i++, tempArr+=sizeElement) scanf(fmt, tempArr);
}

这似乎对我有用...

【讨论】:

  • 我想我有两个问题:scanf 返回的值是如何分配给 *arr (tempArr) 的?另外,无符号字符和有符号字符有什么区别,即为什么必须将其转换为无符号字符?
  • scanf 根据作为第一个参数给出的字符串从 stding 读取一些字节,并将其保存在 tempArr 指向的地址(每次处理输入时递增)。输入字符串提供有关输入所用字节的附加信息,然后将其保存(不检查分配的空间是否足够)到指向的地址。这就是为什么 scanf 不是最安全的方法...
  • 对于 char 与 unsigned char,在处理原始字节时,总是更喜欢 unsigned char。 char 是带符号的值,这意味着它的取值范围为 -128 到 127,或类似​​的值。 unsigned char 的取值范围为 0 ~ 255。这是因为 char 或 unsigned char 在内存中只占用 1 个字节(8 位)的空间。这是 2^8 个不同的值。事实上,当使用没有任何实际区别的字节时。因为你只有一和零。但是,例如 11111111(二进制)值作为有符号是 -128(十进制),但作为无符号它是 255(十进制)。
  • 这是未定义的行为,尽管可能适用于通用系统。但不要在生产代码中这样做。 (转换为unsigned char * 允许对指针进行算术运算;写arr += sizeElement 是不合法的)。
  • @Frustrated Soul BTW:char 在某些系统上已签名(IMO - 更常见)而在其他系统上未签名。 C 允许。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2012-02-07
  • 2023-01-09
相关资源
最近更新 更多