C fscanf丢弃额外字符(如果有)
我正在为我的一个班级做这个项目,上面写着“丢弃三位数字符后的所有内容,直到并包括下一个换行符或EOF” 例如,以下是一个示例测试配置文件:C fscanf丢弃额外字符(如果有),c,stdin,scanf,C,Stdin,Scanf,我正在为我的一个班级做这个项目,上面写着“丢弃三位数字符后的所有内容,直到并包括下一个换行符或EOF” 例如,以下是一个示例测试配置文件: 119 3561234 263abc 我需要将前三位字符分别保存到定义为行、列和值的单个变量中 到目前为止,我掌握的代码如下: /* * Read in the initial puzzle configuration. * Each line is 4 characters long: * Row as a character '0' .
119
3561234
263abc
我需要将前三位字符分别保存到定义为行、列和值的单个变量中
到目前为止,我掌握的代码如下:
/*
* Read in the initial puzzle configuration.
* Each line is 4 characters long:
* Row as a character '0' .. '9'
* Column as character '0' .. '9'
* Digit as character '0' .. '9'
* Terminating newline.
* Exits with an error message if there are syntactic
* or semantic errors with any configuration line.
*/
void configure(FILE *puzzle_file) {
int row, column, value; // Variables
int count = 1; //the counter for what line we are on
/*
* Loops through every line transforming the chars to character int values
* for each int needed and addes it to puzzle and changes fixed values
* at same location.
*/
while((fscanf(puzzle_file, "%1i%1i%1i%*[^\n]", &row, &column, &value)) != EOF){
if(!in_range(row) || !in_range(column) || !in_range(value)){
printf("Illegal format in configuration file at line %i\n", count);
exit(1);
}
if(puzzle[row][column] != 0){
printf("Illegal placement in configuration file at line %i\n",count);
exit(1);
}
puzzle[row][column] = value;
fixed[row][column] = 1;
count++;
}
}
我希望第1行和第1列有9个,第3行和第5列有6个,第2行和第6列有3个
使用正确格式化的配置文件,它将进入第一个if语句并在那里结束
正确的配置文件示例:
123
356
235
etc..
我假设是我的fscanf导致它不能正常工作。你会如何改变它,让它这样做
编辑1:
范围内功能:
/*
* Return TRUE iff the value is in the Sudoku range (1 .. 9)
*/
static bool in_range(int value) {
if(isdigit(value) && value != 0){
return TRUE;
}
return FALSE;
}
似乎您认为fscanf()
使用正则表达式
没有。C没有正则表达式
我想你在寻找:
fscanf(puzzle_file, "%1i%1i%1i%*s", &row, &column, &value)
这将获取第1、第2和第3个字符作为整数,那么该行上的剩余数据将不会存储在变量中
我从未在scanf中见过[^/n]
,显然这不是问题所在
我怀疑问题出在您的in_range()
函数中。那是什么
发布附加代码后编辑:
您的fscanf
很好。您的在\u范围内()
不可用isdigit()
告诉您字符是否为数字
重新阅读您的需求,我建议您的行阅读逻辑:
char buffer[5];
int row, column, value;
int count = 1;
while(fgets(buffer, 5, puzzleFile) != NULL)
{
if ( (buffer[3] == '\n')
&& (sscanf(buffer, "%1i%1i%1i%*[^\n]", &row, &column, &value) == 3))
{
puzzle[row][column] = value;
}
else
{
printf("Illegal format in configuration file at line %i\n", count);
exit(1);
}
count++;
}
这保证了每行有3个字符和换行符fscanf()
使用正则表达式
没有。C没有正则表达式
我想你在寻找:
fscanf(puzzle_file, "%1i%1i%1i%*s", &row, &column, &value)
这将获取第1、第2和第3个字符作为整数,那么该行上的剩余数据将不会存储在变量中
我从未在scanf中见过[^/n]
,显然这不是问题所在
我怀疑问题出在您的in_range()
函数中。那是什么
发布附加代码后编辑:
您的fscanf
很好。您的在\u范围内()
不可用isdigit()
告诉您字符是否为数字
重新阅读您的需求,我建议您的行阅读逻辑:
char buffer[5];
int row, column, value;
int count = 1;
while(fgets(buffer, 5, puzzleFile) != NULL)
{
if ( (buffer[3] == '\n')
&& (sscanf(buffer, "%1i%1i%1i%*[^\n]", &row, &column, &value) == 3))
{
puzzle[row][column] = value;
}
else
{
printf("Illegal format in configuration file at line %i\n", count);
exit(1);
}
count++;
}
这保证了每行有3个字符和换行符
getline()
的方法,一次从文件中读取一行到缓冲区中。然后使用
sscanf(缓冲区,“%1d%1d%1d”、&行、列和值)代码>
将值扫描到变量中。尝试使用类似于getline()
的方法从文件中一次读取一行到缓冲区中。然后使用
sscanf(缓冲区,“%1d%1d%1d”、&行、列和值)代码>
将值扫描到变量中。将在需要时添加额外的代码。格式字符串末尾是正则表达式吗?C没有正则表达式。如果需要,将添加其他代码。在格式字符串的末尾是正则表达式吗?C没有正则表达式。False,C有正则表达式;没有内置到语言本身中,但是POSIX正则表达式确实存在。请参见regex.h.::sign::是的,您可以用C编写正则表达式引擎。考虑到大多数包含正则表达式的语言的解释器和编译器都是用C编写的,这有点道理。它不是语言本身的一部分,POSIX正则表达式也不是我的第一选择。我个人建议使用.Ive尝试了fscanf(拼图文件,%1i%1i%1i%*s,&row,&column,&value),但它仍然给了我一个“第1行配置文件中的非法格式”错误。他的%*[^\n]
非常好。它被称为scanset
,并且fscanf
的每个(一致性)实现(以及scanf、sscanf等)都支持它“*s”
并不是真正的替代品——它将跳过空白,然后读取并忽略连续的非空白,然后停止,因此文件包含类似“123垃圾更多垃圾”的内容,它将在输入中留下“更多垃圾”。False,C有正则表达式;没有内置到语言本身中,但是POSIX正则表达式确实存在。请参见regex.h.::sign::是的,您可以用C编写正则表达式引擎。考虑到大多数包含正则表达式的语言的解释器和编译器都是用C编写的,这有点道理。它不是语言本身的一部分,POSIX正则表达式也不是我的第一选择。我个人建议使用.Ive尝试了fscanf(拼图文件,%1i%1i%1i%*s,&row,&column,&value),但它仍然给了我一个“第1行配置文件中的非法格式”错误。他的%*[^\n]
非常好。它被称为scanset
,并且fscanf
的每个(一致性)实现(以及scanf、sscanf等)都支持它“*s”
并不是真正的替代品——它将跳过空白,然后读取并忽略连续的非空白,然后停止,因此文件包含类似“123垃圾更多垃圾”的内容,它将在输入中留下“更多垃圾”。这就像while(getline(puzzle_file,tempstr)!=EOF){sscanf(tempstr,%1i%1i,&行,&列,&值)//do work}?@DestroyerDust:yes-处理获取完整行的getline()
,而sscanf()
只解释前三个字符;我想小姐