c - 我想让 fscanf 继续扫描,即使输入中有空格

标签 c scanf

我得到了这一行:

fscanf(file, "%s %[^\t\n]", message);

现在,当它扫描时,我会获取直到空格为止的所有字符,但我希望它读取到行尾,而不是仅读取到空格。

最佳答案

尚不完全清楚你在追求什么。如果您想要该行上的所有数据到换行符(并且您希望读取换行符),那么最简单的是使用 fgets():

if (fgets(message, sizeof(message), file) != 0)
{
    size_t len = strlen(message);
    if (message[len-1] == '\n')
        message[len-1] = '\0';
    else
        ...line was too long to fit in message...
    ...use message...
}

如果您必须使用fscanf(),那么您可以使用:

char message[256];

if (fscanf(file, "%255[^\n]", message) == 1)
{
    int c;
    while ((c = getc(file)) != EOF && c != '\n')
        ;    // Ignore characters to newline
    ...use message...
}

在您的版本中,您(至少)存在三个问题:

fscanf(file, "%s %[^\t\n]", message);
  1. 您必须进行分配的转换规范,但您只提供一个变量。
  2. 您没有检查 fscanf() 的返回值,因此您不知道它是否有效。
  3. 您的格式字符串并不像您想象的那样。

前两个问题相当简单。最后一个不是。 scanf() 系列格式字符串中的空格表示任意的空白序列(扫描集内部除外)。因此,格式字符串中的空白将读取空白(空白、制表符、换行符等),直到输入中存在与空白不匹配的内容。这意味着用于多种用途的字母、数字或标点符号。然后,这些字符的序列将被读入您在解决问题 1 时提供的变量中。

#include <stdio.h>

int main(void)
{
  char msg1[256];
  char msg2[256];
  int  n;

  if ((n = scanf("%s %[^\t\n]", msg1, msg2)) == 2)
    printf("1: <<%s>>\n2: <<%s>>\n", msg1, msg2);
  else
    printf("Oops: %d\n", n);
  return 0;
}

示例运行:

$ ./scan
abracadabra


          widgets
1: <<abracadabra>>
2: <<sigets>>
$

如果您想读取消息中的换行符(或制表符),那么您需要:

if (fscanf(file, "%[^\t\n]", message) != 1)
    ...oops...
else
    ...use message...

关于c - 我想让 fscanf 继续扫描,即使输入中有空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17284786/

相关文章:

c - 如何在给定代码中接受 C 中字符串中的空格

c - 格式化字符串漏洞

c - 不知道如何修复错误

c - 在 C 中对字符数组使用 qsort

C do-while 循环

c - 为什么apache源代码中的APR_OFFSET操作要减去空指针的基地址

java - 什么是 C/C++ 等同于 Java 的异步任务

C:启动旨在识别字符串模式的程序时遇到问题

C fscanf 跳转值

C : Infinite loop when using scanf