Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C fscanf丢弃额外字符(如果有)_C_Stdin_Scanf - Fatal编程技术网

C fscanf丢弃额外字符(如果有)

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' .

我正在为我的一个班级做这个项目,上面写着“丢弃三位数字符后的所有内容,直到并包括下一个换行符或EOF”

例如,以下是一个示例测试配置文件:

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个字符和换行符%1i保证,如果所有三个字符都匹配并分配给变量,则每个字符都是0-9范围内的数字(它返回分配的数量)

似乎您认为
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个字符和换行符%1i保证,如果所有三个字符都匹配并分配给变量,则每个字符都是0-9范围内的数字(它返回分配的数量)

尝试使用类似于
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()
只解释前三个字符;我想小姐