在C语言中使用scanf

在C语言中使用scanf,c,string,file,while-loop,scanf,C,String,File,While Loop,Scanf,我的问题似乎很简单,但我在谷歌上找不到答案 我想知道while(fscanf(infle,“%[^\n]”,string)!=EOF)的作用是什么。我正试图使用上面的方法从文件中读取字符串 但是,我不能确切地确定此语句的作用,特别是%[^\n]部分。我知道它将循环到文件的末尾,但“string”是一个数值还是其他值?还有,我如何使用它 例如,对于一个句子“我喜欢树”,字符串值等于什么 感谢您的支持。%[^\n]告诉fscanf读取所有字符,不包括\n和空格%[^\n]告诉fscanf读取所有字符

我的问题似乎很简单,但我在谷歌上找不到答案

我想知道while(fscanf(infle,“%[^\n]”,string)!=EOF)的作用是什么。我正试图使用上面的方法从文件中读取字符串

但是,我不能确切地确定此语句的作用,特别是
%[^\n]
部分。我知道它将循环到文件的末尾,但“string”是一个数值还是其他值?还有,我如何使用它

例如,对于一个句子“我喜欢树”,字符串值等于什么


感谢您的支持。

%[^\n]
告诉
fscanf
读取所有字符,不包括
\n
空格

%[^\n]
告诉
fscanf
读取所有字符,不包括
\n
空格
“%[^\n]”
基本上它匹配所有东西,除了
\n
''
字符

您使用的
fscanf
语句将读取
infle
指向的文件中的所有内容,然后将读取的内容存储到名为
string
的字符串中,该字符串应声明为
char string[500]
(或类似的足够大的值)。每次它成功读取一个字符时,它都会返回该字符

现在,由于您需要一种方法使
while
循环在读取文件后退出,因此您正在将
fscanf
的返回值与
EOF
进行比较,后者是特殊的文件结尾字符

编辑:已更正
常量字符*

“%[^\n]”
基本上它匹配所有内容,除了
\n
'
字符

您使用的
fscanf
语句将读取
infle
指向的文件中的所有内容,然后将读取的内容存储到名为
string
的字符串中,该字符串应声明为
char string[500]
(或类似的足够大的值)。每次它成功读取一个字符时,它都会返回该字符

现在,由于您需要一种方法使
while
循环在读取文件后退出,因此您正在将
fscanf
的返回值与
EOF
进行比较,后者是特殊的文件结尾字符


编辑:已更正
常量字符*

注意插入符号
^
后的空格以及
fscanf
格式字符串
“%[^\n]”
中的尾随空格

fscanf(inFile, "%[^ \n] ", string)
上面的语句意味着
fscanf
将从流
infle
中读取并匹配任何不包含空格
'
或换行符
'\n'
的非空字符序列,并将它们写入下一个参数
string
指向的缓冲区指针中,然后读取并丢弃任意数量(包括零)的空白字符(指格式字符串中的尾随空格)。
string
指向的缓冲区必须足够大,可以容纳任何这样的字符序列加上自动添加的终止空字节。如果缓冲区不够大,则
fscanf
将调用未定义的行为使其溢出,很可能导致程序因segfault而崩溃。您必须通过指定最大字段宽度来防止这种情况,该宽度应小于缓冲区的长度,以容纳终止的空字节

fscanf
返回成功匹配和分配的输入项目总数,在本例中为一个。当到达流
infle
中的文件结尾时,它将返回
EOF
。因此,
while
循环条件意味着,
fscanf
将读取这样的字符序列,并将其写入缓冲区
字符串
,直到到达流
infle
中的文件结尾

您应该将
while
循环更改为-

// assuming string is a char array

char string[100];

while(fscanf(inFile, "%99[^ \n] ", string) == 1) {
    // return value 1 of fscanf means fscanf call was successful
    // do stuff with string
}

请注意插入符号
^
后的空格和格式字符串
“%[^\n]”
中的尾随空格

fscanf(inFile, "%[^ \n] ", string)
上面的语句意味着
fscanf
将从流
infle
中读取并匹配任何不包含空格
'
或换行符
'\n'
的非空字符序列,并将它们写入下一个参数
string
指向的缓冲区指针中,然后读取并丢弃任意数量(包括零)的空白字符(指格式字符串中的尾随空格)。
string
指向的缓冲区必须足够大,可以容纳任何这样的字符序列加上自动添加的终止空字节。如果缓冲区不够大,则
fscanf
将调用未定义的行为使其溢出,很可能导致程序因segfault而崩溃。您必须通过指定最大字段宽度来防止这种情况,该宽度应小于缓冲区的长度,以容纳终止的空字节

fscanf
返回成功匹配和分配的输入项目总数,在本例中为一个。当到达流
infle
中的文件结尾时,它将返回
EOF
。因此,
while
循环条件意味着,
fscanf
将读取这样的字符序列,并将其写入缓冲区
字符串
,直到到达流
infle
中的文件结尾

您应该将
while
循环更改为-

// assuming string is a char array

char string[100];

while(fscanf(inFile, "%99[^ \n] ", string) == 1) {
    // return value 1 of fscanf means fscanf call was successful
    // do stuff with string
}
while(fscanf(infle,“%[^\n]”,string)!=EOF)
有很大的问题

格式字符串
“%[^\n]”
由两条指令组成:
“%[^\n]”

“%[^\n]”
是由扫描集组成的格式说明符。扫描集由除
'
'\n'
之外的所有
字符组成。因此
fscanf()
查找扫描集中的一个或多个字符并保存