printf("Enter path for mount drive (/mnt/Projects) \n");
scanf("%s", &cMountDrivePath);
是否可以允许用户只需按下回车并接受默认值(在此情况下为/mnt/Projects)?
目前,如果用户按下回车键,光标只会移到下一行,仍然需要输入。
我认为scanf不允许这样做,那么我应该用什么?
谢谢!
printf("Enter path for mount drive (/mnt/Projects) \n");
scanf("%s", &cMountDrivePath);
是否可以允许用户只需按下回车并接受默认值(在此情况下为/mnt/Projects)?
目前,如果用户按下回车键,光标只会移到下一行,仍然需要输入。
我认为scanf不允许这样做,那么我应该用什么?
谢谢!
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 (i.e., 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()
或fgets()
时留下的),那么这可能会导致未来调用scanf()
或fgets()
立即返回。对于交互式输入,最好使用fgets()
读取到下一个换行符为止的所有文本,然后根据需要解析和转换该文本缓冲区。 - John Bode我认为fgets()
在输入方面提供了更多的可能性,特别是在处理空行时。
或者,如果你决定使用scanf,请使用一个格式字符串来限制将要被扫描的字符数(以防止缓冲区溢出错误)。
例如,如果你的缓冲区大小为128个字节(包括空终止符):
scanf("%127s", &cMountDrivePath);
不,scanf()不能接受“默认值”。您必须获取输入,检查其是否为空,并自己分配默认值。
正如您发现的那样,scanf()很棘手;我同意extraneon的看法,fgets()可能是您要寻找的。
编辑:
scanf()不响应的原因是... scanf()在处理完所有转换说明符或遇到错误后返回。与所有转换说明符(在本例中为“%s”)一样,前导空格将被跳过。此外,“%s”读取所有字符直到下一个空格。
按回车键会在标准输入中插入“\n”。因此,如果您在输入其他内容之前按回车键(除了可能几个制表符和空格),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 */ ;
}
也许你可以使用这个:
void defaultScanf (char *value, char defaultValue)
{
char trash;
*value = getchar();
/* set your default valut */
if (*value == '\n') {
*value = defaultValue;
} else {
*value -= '0'; /* transform char to int */
/* clean your buffer */
do trash = getchar();
while (trash != '\n' && trash != EOF);
}
}