Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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_String_File_Formatting_Scanf - Fatal编程技术网

如何在C中使用fscanf()来识别被识别为字符串的模式?

如何在C中使用fscanf()来识别被识别为字符串的模式?,c,string,file,formatting,scanf,C,String,File,Formatting,Scanf,我想使用fscanf识别以下模式: Product|10|Meter 一种产品,其数量和计量单位 使用fscanf()作为: fscanf(file, "%s|%d|%s"); 我遇到的问题是字符串拾取所有内容,而其他变量没有收到任何值 这是我的代码: while ((fscanf(arqProdTemp, "%s|%d|%s", insumo, qtdInsumos, unidade)) != EOF) { printf("%s - %d %s", insumo, qtdInsum

我想使用fscanf识别以下模式:

Product|10|Meter
一种产品,其数量和计量单位

使用
fscanf()
作为:

fscanf(file, "%s|%d|%s");
我遇到的问题是字符串拾取所有内容,而其他变量没有收到任何值

这是我的代码:

while ((fscanf(arqProdTemp, "%s|%d|%s", insumo, qtdInsumos, unidade)) != EOF) {
    printf("%s - %d %s", insumo, qtdInsumos, unidade);
}

当我使用
printf()
函数时,
insumo
的结果就是整个字符串

根据评论中的建议,您可以

fscanf(arqProdTemp, "%[^|]|%d|%s", insumo, &qtdInsumos, unidade);
请注意,如果
qtdInsumos
是一个整数变量,则需要使用
&qtdInsumos
将其地址传递到
fscanf()
。不是它的价值

insomo
unidade
是用于存储字符串的字符数组。确保数组足够大以存储字符串,并使用宽度说明符,如

fscanf(arqProdTemp, "%14[^|]|%d|14%s", insumo, &qtdInsumos, unidade);
其中15被假定为两个阵列的大小。根据需要更换

另外,检查
fscanf()
的返回值以查看是否一切正常
fscanf()
返回成功分配的数量,在本例中必须为3

if( fscanf(arqProdTemp, "%[^|]|%d|%s", insumo, &qtdInsumos, unidade) != 3 )    
{
    //Something went wrong
}

正如评论中所建议的,您可以这样做

fscanf(arqProdTemp, "%[^|]|%d|%s", insumo, &qtdInsumos, unidade);
请注意,如果
qtdInsumos
是一个整数变量,则需要使用
&qtdInsumos
将其地址传递到
fscanf()
。不是它的价值

insomo
unidade
是用于存储字符串的字符数组。确保数组足够大以存储字符串,并使用宽度说明符,如

fscanf(arqProdTemp, "%14[^|]|%d|14%s", insumo, &qtdInsumos, unidade);
其中15被假定为两个阵列的大小。根据需要更换

另外,检查
fscanf()
的返回值以查看是否一切正常
fscanf()
返回成功分配的数量,在本例中必须为3

if( fscanf(arqProdTemp, "%[^|]|%d|%s", insumo, &qtdInsumos, unidade) != 3 )    
{
    //Something went wrong
}

%s
拾取所有连续的非空白字符。查看
%[]
,例如
%[^ |]
,但我会用它来代替吗?我需要三个值中的一个。他建议您使用
“%[^ |][124;%d |%s”
。也就是说,将第一个
%s
替换为
%[^ |]
。或者,对于此类任务,您可以从
fgets
和类似
strtok
的内容开始,而不是使用
fscanf
。请注意,您应该使用
while(fscanf(…)==3)
来确保读取3个值。如果得到2、1或0,则会出现各种格式问题(当前模式不可能返回0,但一般来说,这是一个选项)。以及表示没有更多数据可读取的EOF。
%s
拾取所有连续的非空白字符。查看
%[]
,例如
%[^ |]
,但我会用它来代替吗?我需要三个值中的一个。他建议您使用
“%[^ |][124;%d |%s”
。也就是说,将第一个
%s
替换为
%[^ |]
。或者,对于此类任务,您可以从
fgets
和类似
strtok
的内容开始,而不是使用
fscanf
。请注意,您应该使用
while(fscanf(…)==3)
来确保读取3个值。如果得到2、1或0,则会出现各种格式问题(当前模式不可能返回0,但一般来说,这是一个选项)。以及表示没有更多数据可读取的EOF。