使用 %s 获取输出但 %c 返回垃圾值
Getting an output with %s but %c is returning garbage value
我想接受学生的详细信息(姓名、卷号和分数)并打印相同内容 output.The 如果我接受名称作为字符串,程序运行正常,但当我遇到问题时接受学生的名字作为角色。
这是代码:
#include<stdio.h>
int main()
{
struct student
{
char name;
int rn;
float marks;
};
struct student s[2];
int i;
printf("Enter student's name,roll no. and marks:\n");
for(i=1;i<=2;i++)
{
printf("%d ",i);
scanf("%c %d %f",&s[i].name,&s[i].rn,&s[i].marks);
}
printf("Student's name,roll no. and marks are:\n");
for(i=1;i<=2;i++)
printf("\nname=%c\trn=%d\tmarks=%0.2f\n\n",s[i].name,s[i].rn,s[i].marks);
}
学生 1 的信息完全correct.But学生输出中存在问题2.I只想知道学生 2 的实际情况。
Struct 是一种值类型,它在堆栈上保存单个内存块。所以 1 个字符包含(取决于系统)1 个字符,如 'M'。为了保留名称,您需要一个指针或字符数组。这样你只存储 1 个字符,之后会发生一些随机内存垃圾,因为你引用的是越界值,在这种情况下只有 1 个字符。
当我接受学生的名字作为字符时我遇到问题? 那是因为 scanf()
是行缓冲的,即当你输入 一个字符 然后你按 ENTER 键,这也是一个有效的字符所以你给了两个字符作为输入。为避免此缓冲问题,请在 %c
之前提供空格。例如
for(i = 0;i < 2;i++) { /* also you had s[2] means, you should start from i = 0 */
scanf(" %c%d%f",&s[i].name,&s[i].rn,&s[i].marks);
}
主要问题是 for(i=1;i<=2;i++)
,因为您从 s[1]
开始并期望存储到 s[2]
,但没有像您声明的那样 s[2]
struct student s[2];
表示 s[0]
& s[1]
, 解是从 i = 0
.
开始
改变这个:
for(i=1;i<=2;i++)
对此:
for(i=0; i < 2; i++)
因为索引从 0 开始到数组大小减 1。
我想接受学生的详细信息(姓名、卷号和分数)并打印相同内容 output.The 如果我接受名称作为字符串,程序运行正常,但当我遇到问题时接受学生的名字作为角色。 这是代码:
#include<stdio.h>
int main()
{
struct student
{
char name;
int rn;
float marks;
};
struct student s[2];
int i;
printf("Enter student's name,roll no. and marks:\n");
for(i=1;i<=2;i++)
{
printf("%d ",i);
scanf("%c %d %f",&s[i].name,&s[i].rn,&s[i].marks);
}
printf("Student's name,roll no. and marks are:\n");
for(i=1;i<=2;i++)
printf("\nname=%c\trn=%d\tmarks=%0.2f\n\n",s[i].name,s[i].rn,s[i].marks);
}
学生 1 的信息完全correct.But学生输出中存在问题2.I只想知道学生 2 的实际情况。
Struct 是一种值类型,它在堆栈上保存单个内存块。所以 1 个字符包含(取决于系统)1 个字符,如 'M'。为了保留名称,您需要一个指针或字符数组。这样你只存储 1 个字符,之后会发生一些随机内存垃圾,因为你引用的是越界值,在这种情况下只有 1 个字符。
当我接受学生的名字作为字符时我遇到问题? 那是因为 scanf()
是行缓冲的,即当你输入 一个字符 然后你按 ENTER 键,这也是一个有效的字符所以你给了两个字符作为输入。为避免此缓冲问题,请在 %c
之前提供空格。例如
for(i = 0;i < 2;i++) { /* also you had s[2] means, you should start from i = 0 */
scanf(" %c%d%f",&s[i].name,&s[i].rn,&s[i].marks);
}
主要问题是 for(i=1;i<=2;i++)
,因为您从 s[1]
开始并期望存储到 s[2]
,但没有像您声明的那样 s[2]
struct student s[2];
表示 s[0]
& s[1]
, 解是从 i = 0
.
改变这个:
for(i=1;i<=2;i++)
对此:
for(i=0; i < 2; i++)
因为索引从 0 开始到数组大小减 1。