我得到了这一行:
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);
- 您必须进行分配的转换规范,但您只提供一个变量。
- 您没有检查
fscanf()
的返回值,因此您不知道它是否有效。 - 您的格式字符串并不像您想象的那样。
前两个问题相当简单。最后一个不是。 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/