我想知道是否有人可以帮助我解决这个问题:
printf("Enter path for mount drive (/mnt/Projects) \n");
scanf("%s", &cMountDrivePath);
是否可以让用户只需按Enter键并接受默认值(在这种情况下: / mnt / Projects )? 目前,如果用户按下Enter,光标只会转到下一行,仍然需要输入。
我得到的印象 scanf 不允许这样,在这种情况下,我应该使用什么?
谢谢!
答案 0 :(得分:4)
我认为fgets()
为您提供了更多的输入可能性,尤其是空行。
答案 1 :(得分:4)
不,scanf()
无法配置为接受默认值。为了让事情变得更有趣,scanf()
不能接受空字符串作为有效输入; “%s”转换说明符告诉scanf()
忽略前导空格,因此在您键入不是空白的内容并且然后按Enter键或返回时,它将不会返回。
要接受空输入,您必须使用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
是保留字。 Bad 代码猴子,没有香蕉!
答案 2 :(得分:1)
答案 3 :(得分:1)
或者,如果您决定使用scanf,请使用限制数字的格式字符串 将扫描的字符数(以防止缓冲区溢出错误)。
例如,如果您的缓冲区是128字节(包括nul终结符):
scanf("%127s", &cMountDrivePath);
答案 4 :(得分:0)
不,不能使scanf()接受“默认值”。你必须得到输入,检查它是否为空,并自己指定一个默认值。
正如您所知,scanf()很棘手;我同意pergets,fgets()可能就是你要找的东西。
修改强>
scanf()没有反应的原因... scanf()在它之后返回a)处理所有转换说明符或b)遇到错误。与所有转换说明符一样(在这种情况下为“%s”),跳过前导空格。此外,“%s”会读取所有字符,直到下一个空格。
按返回键将'\ n'插入标准输入。因此,如果在输入任何其他内容之前按回车键(除了可能有几个选项卡和空格),scanf()会跳过您的输入并继续等待非空白输入。
无论你输入什么内容,scanf()都不会“看到”它,直到你按回车键,因为你的输入保存在控制台缓冲区中。 (否则你将无法通过输入退格。)再次按返回“\ n”进入输入流,所以即使您没有输入任何内容,“%s”也会终止您键入的行上的标签/空格。
如果您 输入空格,那么您的cMountDrivePath将只包含第一个“单词”直到第一个空格,这就是为什么在目录或文件名中留下空格会让事情变得非常烦人。它还会将其余部分保留在输入缓冲区中,因此下次调用scanf()时,它不会立即请求输入,而是继续处理上一次调用期间缓冲的任何内容 - scanf的另一个恼人的细节( )初学者要注意。
我希望这会为你(以及其他未来的)清除一些东西。
答案 5 :(得分:0)
来自scanf
的手册页:
返回值
这些函数返回成功匹配的输入项的数量 和分配,可以少于提供,甚至零 早期匹配失败的事件。
您可以使用此信息扫描没有用户输入(只是换行符\n
):
printf("Enter path for mount drive (/mnt/Projects) \n");
if (scanf("%80[^\n]s", &cMountDrivePath) < 1) {
/* assign default value */ ;
}
答案 6 :(得分:0)
也许您可以使用此:
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);
}
}