Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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程序_C_File_Scanf - Fatal编程技术网

打印包含字符串和整数的文件,C程序

打印包含字符串和整数的文件,C程序,c,file,scanf,C,File,Scanf,首先,对不起我的英语不好 所以我有一个包含多个字符串和整数的文件 文件内容是 jonny#st.maria#100#200 antony#blabla#90#300 maria#chitchat#45#100 我的代码: #include<stdio.h> char name[10][20], school[10][20]; int op=0, score[8], dis[8]; int read(){ FILE *op = fopen("test.txt","r");

首先,对不起我的英语不好

所以我有一个包含多个字符串和整数的文件

文件内容是

jonny#st.maria#100#200
antony#blabla#90#300
maria#chitchat#45#100
我的代码:

#include<stdio.h>

char name[10][20], school[10][20];

int op=0, score[8], dis[8];

int read(){
  FILE *op = fopen("test.txt","r");

  while(fscanf(op,"%[^#] # %[^#] # %d # %d",name[lis],school[lis],score[lis],dis[lis]) != EOF) 
    lis++;
  fclose(op);
}
#包括
字名[10][20],学校[10][20];;
int op=0,得分[8],dis[8];
int read(){
文件*op=fopen(“test.txt”、“r”);
而(fscanf(op,“%[^#]%[^#][d#%d”,名称[lis],学校[lis],分数[lis],dis[lis])!=EOF)
lis++;
fclose(op);
}

它会崩溃吗?你能告诉我正确的方法吗?

你的数组大小不同(有些是8个,有些是10个元素长)。您应该检查是否没有溢出最短的数组。所示代码未编译,因为变量
lis
未定义-如果已定义,则需要确保已将其初始化为0

您的代码也有误导性,因为您有一个全局变量
int op=0
然后在
read()
函数中有
文件*op

您应该检查
fopen()
中的返回值,以确保它正常工作。不这样做并且无法打开文件肯定会带来麻烦

您需要将指向整数变量的指针传递到
fscanf()

请注意,
fscanf()
可以对格式错误的数据返回
0
(或者实际上是
1
2
,或者
3
)。这些值都不同于
EOF
,都表示输入有问题。
fscanf()
的正确测试更接近于:

int lis = 0;
while(lis < 8 && fscanf(op, "%19[^#] # %19[^#] # %d # %d",
                        name[lis], school[lis], &score[lis], &dis[lis]) == 4) 
    lis++;
fclose(op);
return lis;
int-lis=0;
而(lis<8&&fscanf(op),"%19[^#][19[^#][d#%d",,
名称[lis]、学校[lis]、&score[lis]、&dis[lis])==4)
lis++;
fclose(op);
返回lis;
注意,我还将字符串限制为适合数组的大小,并返回读取的学生数


最后,就目前而言,我将注意到
read()
不是一个特别好的名称选择。虽然标准C为用户保留了它,但在POSIX系统上,
read()
是一个系统调用。更好的名称可能是
read_students()

查找程序崩溃原因的最简单方法是使用符号信息(例如,gcc的
-g
)对其进行编译,并在调试器中运行。但这里有一些可能导致崩溃的提示:
lis
定义在哪里?它是否初始化为零?为什么你有10个名字和铲子,但只有8分?为什么不检查
lis
是否超过8(或10,或上限是多少)?为什么不使用
%19[^#]
将读取的字符串限制为19+1个空字符?另外,您的
fscanf
调用可以返回从
EOF
到0到4的任何数字。什么是
lis
。你在哪里申报?