当前位置: 首页 > 知识库问答 >
问题:

scanf()不接受空白

范侯林
2023-03-14

我需要一个scanf()调用来接受空格(没有制表符或换行符,只有'空格符号)。

char buffer[2048];
scanf(" %2048[0-9a-zA-Z ]s", buffer);

我从这个问题的答案中得到了这个格式说明符:

如何使用扫描允许空间输入

虽然它可以很好地接受第一个输入序列,但它在第一个空白字符所在的位置终止,并使用空字符。发生什么事?我是否使用了错误的格式?

我应该说,我在这里使用scanf()是因为安全不是一个问题;我是唯一一个使用这个特殊程序的人,输入的格式是严格的。

共有3个答案

司空鸿禧
2023-03-14

虽然您可以使用scanf,但如果您正在阅读文本行,则首选getline,并提供动态内存分配的优势(当line=NULL时)getline会读取/保存newline字符,因此如果不需要,可以很容易地将其剥离。以下示例说明了这一点:

#include <stdio.h>

int main (void) {

    char *line = NULL;
    ssize_t read = 0;
    size_t n = 0;

    printf ("\nEnter a line of text: ");
    read = getline (&line, &n, stdin);
    line [read - 1] = 0;  /* strip newline from string (optional) */
    read--;

    printf ("\n  read '%zd' characters: '%s'\n\n", read, line);

    return 0;

}

输出:

./bin/getln

Enter a line of text: this is a line of text   with  white ..   ..  space.

  read '52' characters: 'this is a line of text   with  white ..   ..  space.'
濮金鑫
2023-03-14

Scanf不适合处理您希望有特定数量的空白的格式。从scanf手册页:

格式字符串中的空白(如空格、制表符或换行符)与输入中的任何空白匹配,包括无空白。

和:

[

从指定的接受字符集中匹配非空字符序列;下一个指针必须是指向char的指针,并且必须有足够的空间容纳字符串中的所有字符,以及一个终止NUL字符。通常前导空白的跳过被抑制。

这意味着你可以做类似的事情

scanf("%[^\n]",buffer); 

上面写着:“除了字符串末尾的新行外,阅读所有内容”。

或者,如果要跳过第一个空格,可以执行以下操作:

scanf("%*[ ]%[^\n]",buffer); 

这表示“读取但忽略一个空格字符,然后将所有其他内容读入缓冲区”。

凌运恒
2023-03-14

使用scanf("%[^\n]",缓冲区);。它将接受空白。

示例程序-

int main()
{
    char buffer[2048];
    printf("Enter the string\n");
    scanf("%[^\n]",buffer);

    printf("%s\n", buffer);
    return 0;
}

输出-

root@sathish1:~/My Docs/Programs# ./a.out 
Enter the string
abc def ghi ijk
abc def ghi ijk
root@sathish1:~/My Docs/Programs# 
 类似资料:
  • 问题内容: 在Java 8中,这有效: 但这不是: Maps允许使用null键,并且List.class.getSuperclass()返回null。但是Collectors.groupingBy在Collectors.java的第907行发出了NPE: 如果我创建自己的收集器,则此行会更改为: 我的问题是: 1)Collectors.groupingBy的Javadoc并未表示不应映射空键。是否

  • 我无法弄清楚为什么我的日志没有打印到 Logcat,直到我添加了一个标签。我在日志记录方面很懒惰,过去从未添加过标签。自从我做Android工作以来已经有一段时间了,所以我不确定它已经有多久了。为什么我不能再这样做了,有没有办法让它再次工作?我可以很容易地制作自己的方法来打印日志,但我正在寻找是否可以更改设置以使其像以前一样工作。

  • 问题内容: 我如何使用接受空格作为输入? 问题答案: 您不能将包的功能和类似功能用于您要执行的操作,因为引用了包doc: 动词处理的输入是隐式用空格分隔的:除%c外,每个动词的实现都从 丢弃 其余输入中的 前导空格 开始,并且%s动词(和%v读入字符串) 停止在第一个空格 或 第二个空格处占用输入 换行符。 该软件包有意过滤掉空格,这就是它的实现方式。 而是使用读取可能包含您不想过滤掉的空白的行。

  • 我正在使用tomcat v8,并试图通过RequestBody向我的REST API发送一个对象。这个REST API基本上是RequestMethod。这个API内部的逻辑是删除RequestBody中传递的对象。 这对我不起作用。我后来不得不将我的方法转换为POST,但我仍然想知道DELETE是否不接受RequestBody? 这是来自Spring框架或REST原则的限制,还是与我的Tomca

  • 下面,我有我试图使用的代码。它总是命中捕捉,返回空。月和日都是整数,它们已经过检查,以确保它们在现有日期内。不管怎样,我用“05”测试一个月,用“02”测试一天。由于某种原因, ##/## 输入不起作用吗? 编辑:我正在尝试格式化此输出,使其看起来像“May 02”。当我查看文档时,我看到页面的很大一部分专门用于格式化输出。为什么我的格式不是这样?

  • 这是我的蓝图代码。 内部消息工作。 外部消息不工作。 我在docker中运行Red Hat AMQ 7和Fuse 7。内部消息队列在服务之间正常工作。 使用AMQ 6,当在activemq中设置时,我能够向61613上的嵌入式代理发送和接收STOMP消息。xml 现在,我正在使用AMQ 7.0的默认设置,它将接受程序设置为0.0.0.0:61616和61613,这两个接受STOMP协议。 但是相同