- 已关闭。**此问题为not reproducible or was caused by typos。当前不接受答案。
这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
2天前关闭。
社区正在审查是否从昨天开始重新讨论这个问题。
Improve this question
我试着在头文件中定义一个string
数据类型和一个接受用户输入的函数,代码正确地接受了输入(我假设),但是没有给出预期的输出。
这是名为"rosis.h"的头文件的代码
#include <stdio.h>
typedef char *string;
string get_string(string s)
{
string input;
printf("%s", s);
scanf("%s", input);
return input;
}
这是名为"hello.c"的主程序的代码
#include <stdio.h>
#include "rosis.h"
int main(void)
{
string name = get_string("What is your name ?\n");
printf("Oh hey %s!! It's nice to meet you!\n", name);
}
这是输出
hello/ $ gcc hello.c -o hello
hello/ $ ./hello
What is your name ?
rosis
Oh hey (null)!! It's nice to meet you!
注意:我尝试在头文件中将变量"input"初始化为空字符串,但它只会导致分段错误。
2条答案
按热度按时间epfja78i1#
没有内存分配给你的字符串,所以它会指向未分配的内存,当你试图读写这个内存时,你会得到undefined behavior,它可能是一个错误,一个空值,或者预期的结果。
Memory for a string must be allocated。因为我们希望这个内存在这个函数返回后继续存在,所以我们必须使用
malloc
。这不是编写提示函数的有效方法,但它会起作用。
关于
typedef char *string
的注意事项:C字符串不像您可能从其他语言中熟悉的字符串;别装了。记住你是在用指针工作是很重要的。plicqrtu2#
未初始化的值
scanf("%s", input);
失败,因为 * 指针 *input
尚未赋值-内存中用于scanf()
存储输入的位置。scanf("%s", ...
无法读取带有空格的 * 名称如果您的 name 是
"Anime K"
,那么scanf("%s", input
最多只会将"Anime"
读入input
,而将" K\n"
留在stdin
中,以用于下一个输入函数。而是使用
fgets()
读取用户输入的 * 行 *。