Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将字符串读入空指针?_C_String_Pointers_Void_Dynamic Allocation - Fatal编程技术网

C 如何将字符串读入空指针?

C 如何将字符串读入空指针?,c,string,pointers,void,dynamic-allocation,C,String,Pointers,Void,Dynamic Allocation,我一直在尝试从C中的空指针内的用户读取字符串形式的输入。因此,我编写了如下内容: void *ptr; ptr = calloc(100,sizeof(char)); printf("Enter the string: "); fgets(*((char *)ptr),100,stdin); printf("You entered "); puts(*((char *)ptr)); 我知道我可能没有用正确的方法来做,所以有谁能帮我展示一下在空指针中获取字符串输入的正确方法吗? 我想要一些像这样

我一直在尝试从C中的空指针内的用户读取字符串形式的输入。因此,我编写了如下内容:

void *ptr;
ptr = calloc(100,sizeof(char));
printf("Enter the string: ");
fgets(*((char *)ptr),100,stdin);
printf("You entered ");
puts(*((char *)ptr));
我知道我可能没有用正确的方法来做,所以有谁能帮我展示一下在空指针中获取字符串输入的正确方法吗? 我想要一些像这样的东西

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


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

只需将
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
put
将指针作为第一个参数,因此可以使用
(char*)ptr
转换指针


如果编写
*((char*)ptr)
则将空指针视为char指针,但也会使用
*
解除对它的引用,这将为您提供第一个字符。这不是您想要的。

只需将
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
put
将指针作为第一个参数,因此可以使用
(char*)ptr
转换指针


如果编写
*((char*)ptr)
则将空指针视为char指针,但也会使用
*
解除对它的引用,这将为您提供第一个字符。这不是您想要的。

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

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

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

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

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

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


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

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

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


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

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

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

正确,当您将
*
添加到指针旁边时,计算机将获取指针指向的值。您也可以删除(char*)castsys。我总是喜欢更详细的方法。也许是因为我首先学习C++……正确,当你在指针旁边添加<代码> */COD>时,计算机就获得指针指向的值。我总是喜欢更详细的方法。也许是因为我首先学习C++……为什么你不只是<代码> char *pTR=CaloC(100,sieof(char));<代码>而不是?如果这只是说明问题的示例代码,那么就好了,但除此之外,只需使用正确的指针类型并避免强制转换。请注意,
sizeof(char)
始终是
1
@hyde,我正在尝试学习如何使用void指针类型,因为它允许我灵活地输入:)为什么不使用
char*ptr=calloc(100,sizeof(char));
相反?如果这只是说明问题的示例代码,则可以,但如果不是,请使用正确的指针类型并避免强制转换。请注意,
sizeof(char)
始终是
1
@hyde我正在尝试