如何只需按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 */ ; }