gpt4 book ai didi

c - 这段代码,它工作正常并返回我想要的,但它在打印之前挂起了吗?

转载 作者:太空宇宙 更新时间:2023-11-04 05:06:20 25 4
gpt4 key购买 nike

我制作这个程序::

#include<stdio.h>

char *raw_input(char *msg);

main() {
char *s;
*s = *raw_input("Message Here Is: ");
printf("Return Done..");
printf(s);
}

char *raw_input(char *msg){
char *d;
printf("%s", msg);
scanf("%s",&d);
return d;
}

这是做什么的,它打印我的消息并扫描用户输入,然后打印它,但是打印用户输入有什么问题???

更新::

我需要 raw_input 函数。像这样调用没有任何额外的

*s = *raw_input("Message Here");

我不想用这个::

raw_input("Message Here Is: ", d);
....

只想返回用户将要输入的字符串。

更新 2::

来自 jamesdlin 的回答(谢谢),,现在我清楚了,我的问题在于如何在此 :) 中返回分配的字符串

#include<stdio.h>
#define buffer 128

char *raw_input(char *msg);

main() {
char *s;
s = raw_input("Message Here Is: ");
printf("%s\n",s);
}

char *raw_input(char *msg){
char *d;
printf("%s", msg);
fflush(stdout);
fgets(d, buffer, stdin); ## In this there is a problem
return d;
}

现在,当我启动该程序时,它会打印消息,然后退出(结束)该程序而不接收用户的任何消息 ???

最佳答案

您没有为 d 分配内存,因此在 scanf 中使用它会导致未定义的行为。

实际上,它甚至比这更糟糕:你将 daddress 传递给 scanf,然后用从中读取的整数填充安慰。实际上,您用一个整数值初始化了一个指针,因此该指针指向丛林中的某处。因此取消引用它是未定义的行为。 [更新]:即使这还不是全部:正如@Heath 在下面指出的那样,这实际上允许您通过在控制台上输入足够长的输入来破坏调用堆栈:-((( [/更新]

更不用说您正试图从您的函数返回一个局部变量,该变量一旦超出范围就会被销毁。这应该会更好:

void raw_input(char *msg, char *d);

main() {
char d[128];

raw_input("Message Here Is: ", d);
printf("Return Done..");
printf(d);
}

void raw_input(char *msg, char *d){
printf("%s", msg);
scanf("%s", d);
}

很公平,这并不能防止缓冲区溢出……但足以说明我的观点。

更新:因此您希望在任何情况下都从 raw_input() 返回分配的字符串(即 char* 指针)。据我所知,您有 3 个选择:

  • 返回调用者作为参数传入的指针(我上面的示例的轻微扩展):这是我更喜欢的。然而,这需要一个额外的函数参数(实际上是 2,因为我们还应该在适当的解决方案中传入缓冲区的长度以避免缓冲区溢出)。因此,如果您绝对需要坚持使用上面显示的函数签名,则这不是一个选项。
  • 返回一个指向调用者和被调用者都可见的静态/全局缓冲区的指针:这是上述的变体,以避免修改函数签名。缺点是代码更难理解和维护——你不知道函数修改了一个静态/全局变量而不实际查看它的实现。这反过来也使单元测试更加困难。
  • 返回指向函数内部分配的缓冲区的指针 - 虽然技术上可行,但这是最糟糕的选择,因为您有效地传递了缓冲区的所有权;换句话说,调用者必须记住释放返回的缓冲区。在一个像上面显示的简单程序中,这似乎不是一个大问题,但在一个大程序中,该缓冲区可能会被传递到应用程序中很远的地方,因此很可能没有人释放它最终导致内存泄漏。

关于c - 这段代码,它工作正常并返回我想要的,但它在打印之前挂起了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2530183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com