Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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 用逗号'读取文本文件;s_C - Fatal编程技术网

C 用逗号'读取文本文件;s

C 用逗号'读取文本文件;s,c,C,我试图使用fscanf从infle(stdin或文件)读入表示如下的文件: 1,2,3 4,5,6 请忽略它们是数字这一事实——我将它们表示为字符串 我所做的就是使用 fscanf(infile, "%s%*c %s%*c %s%*c[^\n]", x, y, z); where x, y, z are string variables. 我希望该行上的每个表示数字都存储在x,y,z中,但它不起作用,而是将整行单独存储在x中 需要帮忙吗?谢谢。您使用的是“%s”,它可以将整个单词读到空格。

我试图使用fscanf从infle(stdin或文件)读入表示如下的文件:

1,2,3
4,5,6
请忽略它们是数字这一事实——我将它们表示为字符串

我所做的就是使用

fscanf(infile, "%s%*c %s%*c %s%*c[^\n]", x, y, z); where x, y, z are string variables. 
我希望该行上的每个表示数字都存储在x,y,z中,但它不起作用,而是将整行单独存储在x中


需要帮忙吗?谢谢。

您使用的是“%s”,它可以将整个单词读到空格。因此,在第一行的
x
中读取
1,2,3

您需要做的是将
x
y
z
作为整数,然后您可以读取三个整数并使用多种方法将其转换为字符串(例如
itoa

int x,y,z;
char x_str[20], y_str[20], z_str[20];
//...
fscanf(infile, "%d,%d,%d", x, y, z);
itoa{x,x_str,10);  // and so on
如果您必须使用
scanf
/
fscanf
,那么您希望使用
%[^,]
作为输入格式化程序,而不是
%s
%s
将贪婪地读取尽可能多的内容;
%[^,]
将读取由非
的字符(包括空格)组成的字符串:

fscanf(infile, "%[^,],%[^,],%[^,]", x, y, z);
请注意,
fscanf
的上述用法是不安全的,因为它无法限制读取到每个字符串中的字符数。因此,它完全容易受到缓冲区溢出攻击



就我个人而言,我会用
fgets
(或者
getline
,如果有的话)阅读整行内容然后在
上用
strtok
标记它,这通常是应该避免的。

有很多o行工具来检查正则表达式:@Asaf
scanf
不使用正则表达式。你最好用
fgets
(或者
getline
,如果有的话)并使用
strtok
scanf
(和
fscanf
)对其进行标记化是出了名的难以正确使用。很遗憾,我必须使用fscanf或scanf!@jamesdli…我忽略了scanf部分。也许他应该将扫描f的结果存储在一个数组中,然后测试字符串是否通过正则表达式测试…但正则表达式似乎有问题,没有失去泛化z是ac实际上是一个字符串,它是一个由单词和数字组成的字符串。在这种情况下,您可以使用
fscanf(infle,“%d,%s”,x,y,z_str);
来读取文件的一行。
z_str
是一个字符串,可以直接读取。如果它是OP(x,y,z\n)的格式,您可能需要类似于
“%[^,],%[^,],%[^,],%[^\n]”
,可能在逗号后加空格。我想这正好说明了你的观点:)