使用C语言获取用户输入的文本

21

我正在学习C语言,并制作一个基本的“hello,NAME”的程序。我已经让它能够读取用户的输入,但输出的是数字而不是他们输入的内容?

我做错了什么?

#include <stdio.h>

int main()
{
    char name[20];

    printf("Hello. What's your name?\n");
    scanf("%d", &name);
    printf("Hi there, %d", name);

    getchar();
    return 0;
}

使用%s代替%d,并使用fgets而不是scanf。fgets从字符串流中读取输入。 - Moonhead
你可能想阅读例如这个参考链接 - Some programmer dude
4
C程序通常不被称为“脚本”,它们是程序。 - unwind
4个回答

34
你使用了错误的格式说明符 %d - 应该使用 %s。最好使用fgets - scanf不是缓冲区安全的。
仔细阅读文档应该不难: scanffgets 示例代码:
#include <stdio.h>

int main(void) 
{
    char name[20];
    printf("Hello. What's your name?\n");
    //scanf("%s", &name);  - deprecated
    fgets(name,20,stdin);
    printf("Hi there, %s", name);
    return 0;
}

输入:

The Name is Stackoverflow 

输出:

Hello. What's your name?
Hi there, The Name is Stackov

6
注意,fgets()函数还会获取输入末尾的换行符(\n)。因此,“Bob”作为输入会被捕获为“Bob\n”。如果这是不可接受的,则需要手动删除换行符。你需要加入以下代码行: name[strlen(name)-1] = '\0'; - Babar-Baig

7
#include <stdio.h>

int main()
{
char name[20];

printf("Hello. What's your name?\n");
scanf("%s", name);
printf("Hi there, %s", name);

getchar();
return 0;
}

@user2036031,请查看此链接(https://dev59.com/HnM_5IYBdhLWcg3waSX9),我认为这就是你的程序在显示消息后立即关闭的原因。 - Omer Obaid
在使用scanf读取字符串时,不应该使用数组标签的地址,即name。楼主最好正确地学习这一点,不要被这些答案误导... - Utkan Gezer

1
当我们从用户处接收一个字符串作为输入时,会使用 %s,并且需要提供存储该字符串的地址。
scanf("%s",name);
printf("%s",name);

听到名字,会给你数组名称基地址name&name的值将相等,但它们之间有很大的区别。 name给出数组基地址,如果你计算name+1,它会给你下一个地址,即name[1]的地址,但如果你执行&name+1,它将是整个数组下一个地址


-2

将您的代码更改为:

int main()
{
    char name[20];

    printf("Hello. What's your name?\n");
    scanf("%s", &name);
    printf("Hi there, %s", name);

    getchar();
    getch();                  //To wait until you press a key and then exit the application
    return 0;
}

这是因为,%d 用于整数数据类型,而 %s 和 %c 用于字符串和字符类型。

在使用scanf读取字符串时,不应该使用数组标签的地址,即name。楼主最好正确地学习这一点,不要被这些答案误导... - Utkan Gezer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接