我一直在尝试在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
输出: - 您输入了:欢迎用户
答案 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);
fgets
和puts
将指针作为第一个参数,因此您可以使用(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()
的合法参数。