Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用scanf通过简单地按Enter键接受默认值?_C_Objective C - Fatal编程技术网

如何使用scanf通过简单地按Enter键接受默认值?

如何使用scanf通过简单地按Enter键接受默认值?,c,objective-c,C,Objective C,我想知道是否有人可以帮我: printf("Enter path for mount drive (/mnt/Projects) \n"); scanf("%s", &cMountDrivePath); 是否允许用户只需按Enter键并接受默认值(在本例中为:/mnt/Projects)? 目前,如果用户按Enter键,光标只会转到下一行,仍然需要输入 我得到的印象是scanf不允许这种情况,在这种情况下,我应该使用什么 谢谢 scanf是邪恶的,因为它不进行边界检查 请使用 如果

我想知道是否有人可以帮我:

printf("Enter path for mount drive (/mnt/Projects) \n");
scanf("%s", &cMountDrivePath);  
是否允许用户只需按Enter键并接受默认值(在本例中为:/mnt/Projects)? 目前,如果用户按Enter键,光标只会转到下一行,仍然需要输入

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


谢谢

scanf是邪恶的,因为它不进行边界检查

请使用

如果编译器支持C++,只需使用

< P>我认为 fgScript()>代码>在输入中,特别是空白行中有更多的可能性。

< P>不,SCANFF()不能接受“默认值”。您必须获取输入,检查它是否为空,然后自己指定一个默认值

正如您所发现的,scanf()很棘手;我同意extraneon的观点,即fgets()可能是您正在寻找的

编辑:

scanf()没有反应的原因是。。。scanf()在a)处理所有转换说明符或b)遇到错误后返回。与所有转换说明符(本例中为“%s”)一样,将跳过前导空格。此外,“%s”将读取所有字符,直到下一个空格

按回车键将“\n”插入标准输入。因此,如果在输入任何其他内容(可能除了几个制表符和空格)之前按return键,scanf()将跳过输入并继续等待非空白输入

无论您输入什么,scanf()都不会“看到”它,直到您按return键,因为您的输入保存在控制台缓冲区中。(否则您将无法通过输入返回空格。)再次按return键将“\n”输入到输入流中,因此即使您在键入的行上没有输入任何制表符/空格,您的“%s”也将终止

如果您确实输入了空格,那么cMountDrivePath将只包含第一个“单词”直到第一个空格,这就是为什么在目录或文件名中留下空格会让事情变得如此讨厌的原因。它还会将行的其余部分保留在输入缓冲区中,因此下次调用scanf()时,它不会立即请求输入,而是继续处理上一次调用中缓冲的内容—这是scanf()初学者需要注意的另一个恼人的细节


我希望这能为您(以及其他即将到来的人)澄清一些问题。

或者,如果您决定使用scanf,请使用限制数字的格式字符串 将被扫描的字符数(以防止缓冲区溢出错误)

例如,如果缓冲区为128字节(包括nul终止符):

否,
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的手册页中:

返回值
这些函数返回成功匹配的输入项目数 和已分配的,该值可以小于提供的值,甚至可以为零 早期匹配失败的事件

您可以使用此信息来扫描无用户输入(只需换行符
\n
):

printf(“输入装载驱动器的路径(/mnt/Projects)\n”);
如果(扫描(“%80[^\n]s”,&cMountDrivePath)<1){
/*指定默认值*/;
}

也许你可以用这个:

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

这不是Objective-C问题:changed tag and titleRiaz是在Objective-C中编码的,它允许访问C级函数和Objective-C类。因此,这是一个客观的问题。谢谢bodnarbm。我决定发布另一个问题,让它更清楚地说明我所坚持并努力实现的目标。咳嗽。。。GETLIN()不是语言标准的一部分,但它被添加到PosiX2008标准中,这就是为什么它在新的足够版本的GLUBC中。C++,使用STD::GETLIN。scanf不是邪恶的,你可以告诉它使用的最大宽度。你在想什么?(请注意,fgets解决了这个问题。)scanf仍然几乎从未被用于支持fgets和sscanf。如果我只按Enter键(没有任何其他字符),则下一行(我检查输入的地方)不会触发。插入新行,但控制台仍在等待输入。希望这是有道理的。顺便说一句,我不知道Mac和Objective C上是否有直接的行为,但它是Objective C中的一个控制台应用程序。我会检查一下fgets是否让我更幸运。谢谢你的回复,最初是在目标C标签下打开这个问题,有人把它改成C。也许我没有很好地问这个问题,但是我希望在目标C(和基金会/可可)中有一个选择。我的答案是NSFileHandle(使用fileHandleWithStandardInput)感谢所有的答案(re:C!)注意使用fgets,因为它可能会由于某种原因导致溢出,如果我尝试在XCode和Objective-C(作为控制台应用程序)中使用fgets,它不会在stdin上“阻塞”。代码编译正常,但它忽略了对stdin输入的请求。@Riaz:您给出了关于阻塞的冲突消息,请参阅我对您的新问题的评论。()@Riaz:如果输入流中有一个离群的换行符(比如从先前对
scanf()
fgets()
的调用中),这可能会导致以后对
scanf()
fgets()
的调用立即返回。对于交互式输入,最好使用
fgets()
将所有内容作为文本读取到下一个换行符,然后根据需要解析和转换文本缓冲区。@Rog
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);
    }
}