我试图通过在函数之间传递指向字符串的指针,在每种情况下为错误变量分配不同的错误消息,但由于任何原因,效果不佳。
以下是代码:
//This function takes a pointer to a char.
int lee(Fecha *f, char *error){
int checking;
printf("Introduzca una fecha compuesta por día, mes, y año\n");
checking = scanf("%i %i %i", &f->day, &f->month, &f->year);
printf("%d\n", checking);
switch (checking){
case 0:
//The message is assigned to the space where error points to.
*error = "Formato de fecha incorrecto. El día debe ser un entero.";
break;
case 1:
*error = "Formato de fecha incorrecto. El mes debe ser un entero.";
break;
case 2:
*error = "Formato de fecha incorrecto. El año debe ser un entero.";
break;
}
return (checking == 3);
}
int main(){
Fecha f;
//error is declared like a pointer
char * error;
int ret;
//The pointer is passed to the function as argument.
ret = lee(&f, error);
printf("%s", error);
return 0;
}
输出:
user@console:~/$ ./Sesion1
Introduzca una fecha compuesta por día, mes, y año (o 0 0 0 para terminar el programa)
23 dfgadkfhgsñdgh 5
1
Segmentation fault
答案 0 :(得分:0)
您需要传递指向函数输出参数的指针。由于输出参数为char*
,因此指向它的指针为char**
。
要修复,请将相应的行更改为:
int lee(Fecha *f, char **error);
// ...
ret = lee(&f, &error);
答案 1 :(得分:0)
由于你想要输出到字符串,你需要将指针传递给你的char *,所以你需要将错误传递给char **。
所以函数将是
int lee(Fecha *f, char **error){
int checking;
printf("Introduzca una fecha compuesta por día, mes, y año\n");
checking = scanf("%i %i %i", &f->day, &f->month, &f->year);
printf("%d\n", checking);
switch (checking){
case 0:
//The message is assigned to the space where error points to.
*error = "Formato de fecha incorrecto. El día debe ser un entero.";
break;
case 1:
*error = "Formato de fecha incorrecto. El mes debe ser un entero.";
break;
case 2:
*error = "Formato de fecha incorrecto. El año debe ser un entero.";
break;
}
return (checking == 3);
}
int main(){
Fecha f;
//error is declared like a pointer
char * error;
int ret;
//The pointer is passed to the function as argument.
ret = lee(&f, &error);
printf("%s", error);
return 0;
}
另外,你应该考虑在声明之后不要留下没有值的指针,就像你在main()中使用char *错误一样。
问题是,当你有一个未初始化的指针,然后你忘了给它一个值或类似的东西时,它可以指向应用程序内存中的任何位置(或超出它)。虚拟内存可以保护您免于读取和写入其他应用程序内存(一般来说),但您可能会遇到指针恰好指向应用程序内部某些数据的情况。然后,如果您使用此指针进行写入或读取,您将会产生不可预测的结果,从显示错误数据到破坏数据或崩溃应用程序,这显然是您不想要的。