1

作为一个菜鸟,我一直在关注哈佛 CS50 课程。有一次它演示了一个 C 程序,该程序让用户输入他们的姓名,然后显示包含此输入的基本问候语。但是,CS50 演示似乎在序言中使用了一个特殊行,它允许在 C 中使用带有“string”和“GetString()”的字符串。

没有这个,我一直在尝试使用 getchar():

#include<stdio.h>



main(int argc, char *argv[]) 

{

    printf("What's your name? ");    
    char name = getchar();  
    printf("Hello %c!\n", name);
    printf("You're looking cool today.\n");


}

我应该从用户输入的任何内容中取回第一个字符,但是如果我尝试将其延长为带有 char name[] 的整个字符串的 char 数组,我会在编译时收到“不正确的初始化”错误。然而,我在任何地方都看到提到 getchar(),像这样增加数组容量似乎是解决方案。我也在网上看到了 strcpy 的使用,但我一直无法完成这项工作。

我是否忽略了一些非常简单的事情?对此有任何见解,谢谢。

4

2 回答 2

2

您似乎在两种数据类型之间存在根本性的混淆。

char

是一个单字节字符 - 它只能存储一个字符,并且当您使用%c格式说明符打印(如您所做的那样)时,该字节将在屏幕上变成单个字符。只要你是詹姆斯邦德,而你的同事是 Q、M 等,那就可以了。

在我的世界里,人们通常有更长的名字。这些用字符数组表示:

char name[100];

将是这样一个数组,有足够的空间容纳 99 个字符加上终止的'\0'. 将键盘输入读入字符数组是一件出了名的难事——因为如果你做错了,程序会崩溃或更糟(缓冲区溢出导致未定义的行为)。避免这种情况的一种(我首选的)方法是使用该fgets函数 - 这不仅指定输入应该去哪里,还指定在那里分配了多少空间:

char name[100];
printf("what is your name?\n");
fgets(name, 100, stdin);
printf("hello %s\nLooking spiffy!\n", name);

如您所见,fgets它接受三个参数:缓冲区、缓冲区大小和输入流。该名称stdin被定义为标准输入缓冲区(键盘,除非您做了一些稍后将了解的棘手的事情)。注意 - 您传递了 的值,100但只会读取 99 个字符(第 100 个空格用于 nul 终止)。

于 2014-08-10T19:49:10.163 回答
1

该错误取决于编译器。一些编译器给出错误。我的编译器没有(Dev C++)。在我的例子中,它忽略了其余的输入字符并使用了第一个输入的字符。

于 2014-08-10T19:47:03.953 回答