C:scanf()函数不工作,因为它应该

问题描述:

我遇到了scanf()函数的问题。当我编译并运行此代码C:scanf()函数不工作,因为它应该

 int ID; 
     char* name = NULL; 
     char sex; 
     float quiz1; 
     float quiz2; 
     float midscore; 
     float finalscore; 
     float totalscore; 

     printf("please enter the student information.\n"); 
     printf("ID: "); 
     scanf("%i", &ID); 
     printf("Name: "); 
     scanf(" %s", name); 
     printf("Sex: "); 
     scanf(" %c", &sex); 
     printf("Quiz mark(first semester): "); 
     scanf(" %f", &quiz1); 
     printf("Quiz mark(second semester): "); 
     scanf(" %f", &quiz2); 
     printf("Mid-term score: "); 
     scanf(" %f", &midscore); 
     printf("Final score: "); 
     scanf(" %f", &finalscore); 
     printf("Total score: "); 
     scanf(" %f", &totalscore); 

我得到的是:

ID:5
名:Alex
性别:测验标志(第一学期):测验标志(第二学期) :中期得分:最终得分:总得分:

有人能解释我发生了什么事吗?

+0

当调用'scanf()'函数族时,总是检查返回值(而不是参数值)以确保操作成功。当使用'%s'输入/转换说明符时,请始终使用比输入缓冲区长度小1的'最大长度'修饰符,以便用户不能超出输入缓冲区。请记住,这些输入中的每一个都是用一个换行字符序列结尾的。 '%s'在处理空白方面存在问题。并且'%c'将从前一个输入中输入换行符,这些中的每一个都可以通过使用格式字符串中的前导空格来修复。例如, – user3629249

在的

scanf(" %s", name); 

name点是NULL(即,它指向无效的内存位置),并使用该作为参数调用%sundefined behavior

您需要先分配内存到name,然后才能使用它来保存输入。

+0

声明它为'char name [100];' – infixed

+0

@以这种方式定义,'name'将不再是指针,但你也是正确的。 –

+0

我通常在词汇上认为'name'与'&name [0]'是一样的,因此它仍然是一个指针。而不是一个指针变量_variable_你不能通过使用它作为左值来重新绑定它,但仍然可以使用一个指针作为右值 – infixed

这里的问题是:

char* name = NULL; 

你需要写任何数据之前分配一些内存的指针。您可以静态或动态分配一些空间:

char name[10]; 
char *name2; 
name2 = malloc(10*sizeof(char));