如何将字符串读入void指针?

时间:2014-03-31 11:53:45

标签: c string pointers void dynamic-allocation

我一直在尝试在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指针中输入字符串的正确方法吗? 我想要一些东西

输入: - 输入字符串:welcome user

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

4 个答案:

答案 0 :(得分:3)

只需将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指针,但也使用*取消引用它,这将为您提供第一个字符。这不是你想要的。

答案 1 :(得分:1)

您需要删除(char *)强制转型。试试这个:

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

由于你在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()的合法参数。