gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:48:44 25 4
gpt4 key购买 nike

我得到了这一行:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com