C语言 程序在提示用户输入姓名后向一个人打招呼-没有按预期工作[已关闭]

mf98qq94  于 2023-01-16  发布在  其他
关注(0)|答案(2)|浏览(157)

这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是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"初始化为空字符串,但它只会导致分段错误。

epfja78i

epfja78i1#

没有内存分配给你的字符串,所以它会指向未分配的内存,当你试图读写这个内存时,你会得到undefined behavior,它可能是一个错误,一个空值,或者预期的结果。
Memory for a string must be allocated。因为我们希望这个内存在这个函数返回后继续存在,所以我们必须使用malloc

#include <stdlib.h>

string get_string(string s)
{
    string input = malloc(256);
    printf("%s", s);

    // And restrict how much you read to avoid overflowing memory.
    scanf("%255s", input);

    return input;
}

这不是编写提示函数的有效方法,但它会起作用。
关于typedef char *string的注意事项:C字符串不像您可能从其他语言中熟悉的字符串;别装了。记住你是在用指针工作是很重要的。

plicqrtu

plicqrtu2#

未初始化的值

scanf("%s", input);失败,因为 * 指针 * input尚未赋值-内存中用于scanf()存储输入的位置。

scanf("%s", ...无法读取带有空格的 * 名称

如果您的 name"Anime K",那么scanf("%s", input最多只会将"Anime"读入input,而将" K\n"留在stdin中,以用于下一个输入函数。
而是使用fgets()读取用户输入的 * 行 *。

char input[100];
if (fgets(input, sizeof input, stdin)) {
  // Lop off a potential ending '\n'.
  input[strcspn(input, "\n")] = '\0';
  printf("Name :%s:\n", input);
}

相关问题