如何只需按Enter键即可使用scanf接受默认值?

时间:2010-02-22 13:38:17

标签: c objective-c

我想知道是否有人可以帮助我解决这个问题:

printf("Enter path for mount drive (/mnt/Projects) \n");
scanf("%s", &cMountDrivePath);  

是否可以让用户只需按Enter键并接受默认值(在这种情况下: / mnt / Projects )? 目前,如果用户按下Enter,光标只会转到下一行,仍然需要输入。

我得到的印象 scanf 不允许这样,在这种情况下,我应该使用什么?

谢谢!

7 个答案:

答案 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)

scanf是邪恶的,因为它没有边界检查!

请使用getline from the GNU C library

如果您的编译器支持C ++,只需使用istream::getline

即可

答案 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);
    }
}