如何只需按Enter键即可使用scanf接受默认值?
我想知道是否有人可以帮助我这个:
printf("Enter path for mount drive (/mnt/Projects) \n"); scanf("%s", &cMountDrivePath);
是否可以让用户只需按Enter键并接受默认值(在这种情况下: / mnt / Projects )? 目前,如果用户按下Enter键,光标只会转到下一行,仍然需要输入。
我得到印象scanf不允许这样,在这种情况下,我应该使用什么?
谢谢!
我认为fgets()
为你提供了更多的输入可能性,特别是空行。
不, scanf()
不能配置为接受默认值。 为了让事情变得更有趣, scanf()
不能接受空字符串作为有效输入; “%s”转换说明符告诉scanf()
忽略前导空格,因此在键入不是空格的内容然后按Enter或Return键之前它不会返回。
要接受空输入,您必须使用类似fgets()
东西。 例:
char *defaultPath = "/mnt/Projects"; ... printf("Enter path for mount drive (%s): ", defaultPath); fflush(stdout); /** * The following assumes that cMountDrivePath is an * array of char in the current scope (ie, declared as * char cMountDrivePath[SIZE], not char *cMountDrivePath) */ if (fgets(cMountDrivePath, sizeof cMountDrivePath, stdin) != NULL) { /** * Find the newline and, if present, zero it out */ char *newline = strchr(cMountDrivePath, '\n'); if (newline) *newline = 0; if (strlen(cMountDrivePath) == 0) // input was empty { strcpy(cMountDrivePath, defaultPath) } }
编辑
将default
更改为defaultPath
; 忘了default
是保留字。 坏码猴子,没有香蕉!
scanf是邪恶的,因为它没有边界检查!
请使用GNU C库中的getline 。
如果您的编译器支持C ++,只需使用istream :: getline
或者,如果您决定使用scanf,请使用格式字符串来限制将要扫描的字符数(以防止缓冲区溢出错误)。
例如,如果您的缓冲区是128个字节(包括nul终止符):
scanf("%127s", &cMountDrivePath);
不,scanf()不能接受“默认值”。 您必须获取输入,检查其是否为空,并自行分配默认值。
你发现,scanf()很棘手; 我同意pergets,fgets()可能就是你要找的东西。
编辑:
scanf()没有反应的原因… scanf()在它之后返回a)处理所有转换说明符或b)遇到错误。 与所有转换说明符一样(在这种情况下为“%s”),跳过前导空格。 此外,“%s”读取所有字符, 直到下一个空格 。
按返回键将’\ n’插入标准输入。 因此,如果在输入任何其他内容之前按下return(除了可能有几个制表符和空格),scanf()会跳过您的输入并继续等待非空白输入。
无论你输入什么,scanf()都不会“看到”它,直到你按回车键,因为你的输入保存在控制台缓冲区中。 (否则您将无法通过输入退格。) 再次按“返回”会在输入流中输入“\ n”,因此即使您没有在行上输入任何制表符/空格,也会终止“%s”类型。
如果你确实输入了空格,那么你的cMountDrivePath只会包含第一个“单词”到第一个空格,这就是为什么在目录或文件名中留下空格会让事情变得非常烦人。 它还会将其余部分留在输入缓冲区中,因此下次调用scanf()时,它不会立即请求输入,而是继续处理上一次调用期间缓冲的任何内容 – scanf的另一个令人讨厌的细节( )初学者要小心。
我希望这对你(以及其他未来的)有所帮助。
从scanf
的手册页:
返回值
这些函数返回成功匹配和分配的输入项的数量,这可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。
您可以使用此信息扫描没有用户输入(只是换行符\n
):
printf("Enter path for mount drive (/mnt/Projects) \n"); if (scanf("%80[^\n]s", &cMountDrivePath) < 1) { /* assign default value */ ; }