在C中使用getchar来存储多个字符的用户输入

时间:2014-08-10 19:23:17

标签: c string char getchar cs50

作为一名新秀,我一直在关注哈佛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数组,使用char name []整个字符串,我在编译时出现“不正确的初始化”错误。然而,在我看到提到getchar()的所有地方,增加像这样的阵列容量似乎是解决方案。我也看过在线使用strcpy,但我一直无法做到这一点。

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

2 个答案:

答案 0 :(得分:2)

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

char

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

在我的世界里,人们往往有更长的名字。它们用字符 array

表示
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终止)。

答案 1 :(得分:1)

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