C 程序在使用 scanf 而不是 var=0 后停止工作
C Program stopped working after using scanf instead of var=0
所以我有这个代码:
#include <stdio.h>
#include <stdlib.h>
int functie ( int v[], int nr, int z)
{
int i,count;
scanf("%d", &z);
for(i=0;i<nr;i++) {
if(z==v[i]) {
count=count+1;
}
}
return z;
}
int main()
{
int i,nr,z;
fscanf("%d", &z);
FILE *f;
FILE *g;
f=fopen("data-in.txt", "r");
fscanf(f,"%d",&nr);
int *v=malloc(nr*sizeof(int));
for(i=0;i<nr;i++) {
fscanf(f,"%d",&v[i]);
}
g=fopen("data-out.txt", "w");
fprintf(g,"%d %d", functie(v,nr,z));
fclose(f);
fclose(g);
free(v);
}
在我有 int z=0; 之前而不是尝试扫描我的 var z。
当我 运行 这个时,我得到一个停止工作的错误。
我有一个数组,其中包含从文件中读取的数字(整数),第一行是元素的数量,第二行是元素的数量。
我需要一个 var 让我们说 z 来检查一个元素在向量中出现了多少次(检查扫描的数字 z 是否等于一个元素和 +1 计数)
示例:
在文件中
4(因为我有 4 个元素)
1 2 3 3(我的元素)
比将 z 扫描为 3
z==3 真
计数=1
再次
数=2
这里有两个问题,都在 main
中。第一:
fscanf("%d", &z);
此函数需要 FILE *
作为您未指定的第一个参数。大概你想从控制台读取,所以使用 scanf
:
scanf("%d", &z);
第二期:
fprintf(g,"%d %d", functie(v,nr,z));
您的格式字符串需要两个整数参数,但您只传入了一个。去掉额外的格式说明符:
fprintf(g,"%d", functie(v,nr,z));
fscanf 不会被换行分隔。最好的办法是使用 fgets 一次吃掉一行文件。因此,在 main 的顶部添加一个行缓冲区:
char line[16]; // assuming integers will actually be small
使用 'f' 打开文件后:
if (fgets(line, sizeof(line), f))
{
int count = atoi(line);
int *v = (int *) malloc(count * sizeof(int));
for (int i = 0; i < count && fgets(line, sizeof(line), f); ++i)
{
v[i] = atoi(line);
}
}
你绝对应该在上面添加错误检查,这是最小的并且仅用于概念(例如防止错误输入、缓冲区溢出、异常、计数错误在数组末尾留下未初始化的整数等。 ) 因为这只有在您的输入文件完美时才有效。请注意,对于行缓冲区来说,16 通常是一个小得离谱的长度。如果 (a) 文件打开,并且 (b) 通过第一个测试,这是整数个条目,也只对你的向量执行逻辑。
所以我有这个代码:
#include <stdio.h>
#include <stdlib.h>
int functie ( int v[], int nr, int z)
{
int i,count;
scanf("%d", &z);
for(i=0;i<nr;i++) {
if(z==v[i]) {
count=count+1;
}
}
return z;
}
int main()
{
int i,nr,z;
fscanf("%d", &z);
FILE *f;
FILE *g;
f=fopen("data-in.txt", "r");
fscanf(f,"%d",&nr);
int *v=malloc(nr*sizeof(int));
for(i=0;i<nr;i++) {
fscanf(f,"%d",&v[i]);
}
g=fopen("data-out.txt", "w");
fprintf(g,"%d %d", functie(v,nr,z));
fclose(f);
fclose(g);
free(v);
}
在我有 int z=0; 之前而不是尝试扫描我的 var z。 当我 运行 这个时,我得到一个停止工作的错误。
我有一个数组,其中包含从文件中读取的数字(整数),第一行是元素的数量,第二行是元素的数量。 我需要一个 var 让我们说 z 来检查一个元素在向量中出现了多少次(检查扫描的数字 z 是否等于一个元素和 +1 计数)
示例:
在文件中
4(因为我有 4 个元素)
1 2 3 3(我的元素)
比将 z 扫描为 3 z==3 真 计数=1 再次 数=2
这里有两个问题,都在 main
中。第一:
fscanf("%d", &z);
此函数需要 FILE *
作为您未指定的第一个参数。大概你想从控制台读取,所以使用 scanf
:
scanf("%d", &z);
第二期:
fprintf(g,"%d %d", functie(v,nr,z));
您的格式字符串需要两个整数参数,但您只传入了一个。去掉额外的格式说明符:
fprintf(g,"%d", functie(v,nr,z));
fscanf 不会被换行分隔。最好的办法是使用 fgets 一次吃掉一行文件。因此,在 main 的顶部添加一个行缓冲区:
char line[16]; // assuming integers will actually be small
使用 'f' 打开文件后:
if (fgets(line, sizeof(line), f))
{
int count = atoi(line);
int *v = (int *) malloc(count * sizeof(int));
for (int i = 0; i < count && fgets(line, sizeof(line), f); ++i)
{
v[i] = atoi(line);
}
}
你绝对应该在上面添加错误检查,这是最小的并且仅用于概念(例如防止错误输入、缓冲区溢出、异常、计数错误在数组末尾留下未初始化的整数等。 ) 因为这只有在您的输入文件完美时才有效。请注意,对于行缓冲区来说,16 通常是一个小得离谱的长度。如果 (a) 文件打开,并且 (b) 通过第一个测试,这是整数个条目,也只对你的向量执行逻辑。