如何使用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>我认为我希望这能为您(以及其他即将到来的人)澄清一些问题。或者,如果您决定使用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);
}
}