在Visual Studio中,fscanf给了我这个错误:
在ProgramaçãoImperativa.exe中的0x6080D4EC(ucrtbased.dll)处未处理的异常:0xC0000005:访问冲突写入位置0x00D0B000。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <string.h>
struct estrutura
{
char nome[100];
float no1;
float no2;
float valor;
}v1, r1, r2, r3, r4;
int main(void)
{
FILE *circuito;
int x;
setlocale(LC_ALL, "Portuguese");
circuito = fopen("circuito.cir", "r");
if (circuito == NULL)
{
printf("Erro na abertura do ficheiro");
}
else
{
while ((x = fgetc(circuito)) != '\n');
fscanf_s(circuito, "%s %f %f %f\n", v1.nome, &v1.no1, &v1.no2, &v1.valor);
printf("%s %lf %lf %lf \n", v1.nome, v1.no1, v1.no2, v1.valor);
fscanf_s(circuito, "%s %f %f %f\n", r1.nome, &r1.no1, &r1.no2, &r1.valor);
printf("%s %f %f %f \n", r1.nome, r1.no1, r1.no2, r1.valor);
}
return 0;
}
答案 0 :(得分:5)
您将fscanf_s
与%s
指定符一起使用不正确。
不同于
fscanf
...fscanf_s
...要求缓冲区大小为 为类型c,C,s,S或字符串的所有输入参数指定 []中包含的控件集。缓冲区大小(以字符为单位)为 作为附加参数传递给指针之后 缓冲区或变量。
因为传递的参数太少,所以传递的用于接受最后一个%f
值的地址是不确定的。
编译器应该警告您有关缓冲区大小参数丢失的情况。