作为一名新秀,我一直在关注哈佛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,但我一直无法做到这一点。
我是否忽略了一些非常简单的事情?有任何见解,谢谢。
答案 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 ++)。 在我的例子中,它忽略了其余的输入字符并使用了第一个输入的字符。