【问题标题】:How to read a string into a void pointer?如何将字符串读入空指针?
【发布时间】:2014-05-10 18:01:26
【问题描述】:

我一直在尝试从 C 中的 void 指针中的用户读取输入作为字符串。所以我写了如下内容:

void *ptr;
ptr = calloc(100,sizeof(char));
printf("Enter the string: ");
fgets(*((char *)ptr),100,stdin);
printf("You entered ");
puts(*((char *)ptr));

我知道我可能没有以正确的方式进行操作,所以任何人都可以帮助我展示在 void 指针中获取字符串输入的正确方法吗? 我想要一些东西

输入:- 输入字符串:欢迎用户

输出:- 您输入:欢迎用户

【问题讨论】:

  • 你为什么不直接使用char *ptr = calloc(100, sizeof(char)); 呢?如果这只是用于说明问题的示例代码,那很好,否则只需使用正确的指针类型并避免强制转换。
  • 请注意sizeof(char) 始终是1
  • @hyde 我正在尝试学习如何使用 void 指针类型,因为它让我可以灵活地输入:)

标签: c string pointers void dynamic-allocation


【解决方案1】:

由于您在fgets() 中的论点,您基本上想要的东西无法实现。

作为函数fgets() 接受三个参数

1.pointer to the first cell of memory at where to store the data.
2.No of characters to be written to memeory.
3.stream pointer,from where to read.

但是你做错的是第一个参数,因为你没有传递一个指向fgets()的指针。你传递*((char *)ptr)它是char类型,因为你不必要的取消引用。删除外部*将治愈它,因为它的类型现在变为char *,您可以将它用作fgets() 的合法参数。

【讨论】:

    【解决方案2】:

    当您将指针传递给 fgets 和 fputs 时,您正在取消对指针的引用,这意味着您传递了内存位置中第一个字符的值。由于您使用 calloc 进行分配,因此您传递了 '\0' (空字符,零)。

    您的 ptr(以及 (char *)ptr)指向一些内存,即它的值是一个地址,即您计算机 RAM 中的一个点。 fgets 会将字符从控制台输入逐字节复制到该内存位置。相比之下,作为参数传递给 fgets 的表达式 *((char *)ptr)存储在该位置的值。 在 calloc() 之后,该值为零,即字符“\0”。 Fgets 认为这是一个指针,尝试访问地址 0 处的内存,然后崩溃。 fputs 也会发生同样的情况,因为在现代 PC 操作系统下,用户程序甚至不允许在“奇怪”地址进行读取访问。正如其他人正确指出的那样,解决方案是省略取消引用“*”。

    顺便问一下,您没有收到编译器警告吗?虽然 C 不是真正的类型安全,但它确实具有函数原型,并且大多数编译器在调用错误的参数类型时会发出警告。

    【讨论】:

      【解决方案3】:

      您需要删除 (char *) 演员表。试试这个:

      void *ptr;
      ptr = calloc(100,sizeof(char));
      printf("Enter the string: ");
      fgets((char *)ptr,100,stdin);
      printf("You entered ");
      puts((char *)ptr);
      

      【讨论】:

      • 但是现在您没有删除演员表,而是 *s - 但是,这是正确的。
      【解决方案4】:

      只需将void* 转换为char*

      void *ptr;
      ptr = calloc(100,sizeof(char));
      printf("Enter the string: ");
      fgets((char*)ptr,100,stdin);
      printf("You entered ");
      puts((char*)ptr);
      

      fgetsputs 将指针作为第一个参数,因此您可以使用(char*)ptr 来转换指针。

      如果你写*((char*)ptr),你把void指针当作一个char指针,但也用*取消引用它会给你第一个字符。这不是你想要的。

      【讨论】:

      • 正确,当您在指针旁边添加* 时,计算机会获取指针指向的值。
      • 你也可以放弃 (char *) 演员表
      • 是的。我总是更喜欢更详细的方法。可能是因为我先学了C++吧……
      猜你喜欢
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多