| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 700 人关注过本帖
标题:[求助] C语言高手来指点一下
只看楼主 加入收藏
jiehong
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2005-12-19
收藏
 问题点数:0 回复次数:8 
[求助] C语言高手来指点一下

我想练习一下结构体,便写出以下程序,结果与我想象中的大不相同,请指点一二

源程序:
#include <stdio.h>
#define SIZE 100

struct student {
char name;
int result;
};

void getStudent(struct student a[]);
void putStudent(struct student a[]);

int main()
{
struct student a[SIZE];
getStudent(a);
printf("\n");
printf("\n");
printf("\n");
printf("\n");
putStudent(a);
return 0;
}

void getStudent(struct student a[])
{
int i;
for(i=0; i<5; i++){
printf("%s","Enter Name: ");
scanf("%c",&a[i].name);
printf("\n");
printf("%s","Enter Result: ");
scanf("%d",&a[i].result);
}
}

void putStudent(struct student a[])
{
int i;
for(i=0; i<5; i++){
printf("Name: %c Result: %d\n",a[i].name,a[i].result);
}
}


期待结果:
Enter Name: a
Enter Result: 1
Enter Name: b
Enter Result: 2
Enter Name: c
Enter Result: 3
Enter Name: d
Enter Result: 4
Enter Name: e
Enter Result: 5

Name: a Result: 1
Name: b Result: 2
Name: c Result: 3
Name: d Result: 4
Name: e Result: 5

但实际的程序执行结果:
Enter Name: a
Enter Result: 1

Enter Name: ------------------------不能输入
Enter Result: 2
Enter Name: ------------------------不能输入
Enter Result: 3
Enter Name: ------------------------不能输入
Enter Result: 4
Enter Name: ------------------------不能输入
Enter Result: 5

Name: a Result: 1
Name:---------------------------------------------
Result: 2 --------------------这两行本应该在同一行的.
Name:
Result: 3
Name:
Result: 4
Name:
Result: 5


请问:为什么会有这样的结果,在"------------------------不能输入"的地方不是应该能输入的吗?在for循环里面为什么会有错呢?在"-----------------------------------" 与 "--------------------这两行本应该在同一行的"的地方为什么不在同一行,而分别显示在两行呢?

谢谢!

搜索更多相关主题的帖子: C语言 
2005-12-19 21:49
我爱我家
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2005-12-19
收藏
得分:0 
这句 printf("%s","Enter Name: ");


为什么输出时 , 还要用 "%s"
2005-12-19 22:35
topfable
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2005-12-19
收藏
得分:0 
tong shang
2005-12-19 22:46
feverxx
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2005-12-20
收藏
得分:0 

是void getStudent(struct student a[])
{
int i;
for(i=0; i<5; i++){
printf("%s","Enter Name: ");
scanf("%c",&a[i].name);
printf("\n");
printf("%s","Enter Result: ");
scanf("%d",&a[i].result);
}
}函数中scanf("%d",&a[i].result);scanf函数的问题,当输入一个数字时,'\n'也就是回车不知道为什么保留,所以在下一个循环体中的scanf("%c",&a[i].name);中直接输入'\n',也就是为什么不能再输入name的原因,编译软件直接输入'\n'了。在{
int i;
for(i=0; i<5; i++){
printf("Name: %c Result: %d\n",a[i].name,a[i].result);
}中把%c改成%d,可清楚地看到name结果10,而且与result同行,10正是'\n'的Asc码。所以在for(i=0; i<5; i++){
printf("%s","Enter Name: ");
scanf("%c",&a[i].name);
printf("\n");
printf("%s","Enter Result: ");
scanf("%d",&a[i].result);
}中增加一行getchar();即可,也就是for(i=0; i<5; i++){
printf("%s","Enter Name: ");
scanf("%c",&a[i].name);
printf("\n");
printf("%s","Enter Result: ");
scanf("%d",&a[i].result);
getchar();
}另外对你的程序进行了一些简化:
#include <stdio.h>
#define SIZE 100
struct student {
char name;
int result;
}a[SIZE];

void getStudent(struct student a[])
{
int i;
for(i=0; i<5; i++)
{
printf("Enter Name: ");
scanf("%c",&a[i].name);
printf("Enter Result: ");
scanf("%d",&a[i].result);
getchar();
}
}
void putStudent(struct student a[])
{
int i;
for(i=0; i<5; i++)
{
printf("Name: %c Result: %d\n",a[i].name,a[i].result);
}
}

int main()
{
getStudent(a);
printf("\n\n\n\n");
putStudent(a);
return 0;
}

2005-12-20 11:04
jiehong
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2005-12-19
收藏
得分:0 

可是我想知道为什么会在函数中scanf("%d",&a[i].result);scanf函数的问题,当输入一个数字时,'\n'也就是回车不知道为什么保留,我又做了以下实验:

#include <stdio.h>

int main()
{
char a,b,c,d,e;
int i,j,k,l,m;

printf("Name: ");
scanf("%c",&a);
printf("Result: ");
scanf("%d",&i);

printf("\n");

printf("Name: ");
scanf("%c",&b);
printf("Result: ");
scanf("%d",&j);

printf("\n");

printf("Name: ");
scanf("%c",&c);
printf("Result: ");
scanf("%d",&k);

printf("\n");


printf("Name: ");
scanf("%c",&c);
printf("Result: ");
scanf("%d",&l);

printf("\n");


}

这程序的执行结果跟以前一样,从第二个开始的Name不能输入,但是如果改成这样:
#include <stdio.h>

int main()
{
char a,b,c,d,e;
int i,j,k,l,m;

printf("Name: ");
scanf("%d",&a);
printf("Result: ");
scanf("%d",&i);

printf("\n");

printf("Name: ");
scanf("%d",&b);
printf("Result: ");
scanf("%d",&j);

printf("\n");

printf("Name: ");
scanf("%d",&c);
printf("Result: ");
scanf("%d",&k);

printf("\n");


printf("Name: ");
scanf("%d",&c);
printf("Result: ");
scanf("%d",&l);

printf("\n");
return 0;
}

也就是将scanf();函数中的"%C" 全改成%d,则不会出现以前的问题,就是正常的,难道说是 scanf("%c", )函数还有什么我不知道的规则?

2005-12-21 10:55
feverxx
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2005-12-20
收藏
得分:0 
An input field is defined as a string of non-white space characters; it extends either to the next white space character or until the field width, is specified, is exhausted. This implies that scanf will read across boundaries to find its input, since newlines are white space. (White space characters are blank, tab, newline, carriage return, vertical tab, and formfeed.)

characters; char *. The next input characters (default 1) are placed at the indicated spot. The normal skip-over white space is suppressed; to read the next non-white space character, use %1s
2006-01-05 16:27
feverxx
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2005-12-20
收藏
得分:0 

一直在连续看书,没有跳过章节,加上看的不怎么认真,进度比较慢。现在我可以大概解释一下问题。上面两段话大意(拣主要地说)是:输入域被定义为非空(blank)字符(空格,TAB,回车(newline),返回值,竖直TAB,进纸都被算作空字符),但它包含下一个空字符或根据指定的场宽结束。
%c输入指定的字符(默认是一个),如果想跳过空字符,则用格式%1s代替%c.

翻译的比较差,不知道你能否看得明白~~~~~~~~
所以修改一下你上面的程序就可以得到想要的结果:

int main()
{
char a,b,c,d,e;
int i,j,k,l,m;

printf("Name: ");
scanf("%c",&a);
printf("Result: ");
scanf("%d",&i);

printf("\n");

printf("Name: ");
scanf("%1s",&b);
printf("Result: ");
scanf("%d",&j);

printf("\n");

printf("Name: ");
scanf("%1s",&c);
printf("Result: ");
scanf("%d",&k);

printf("\n");


printf("Name: ");
scanf("%1s",&c);
printf("Result: ");
scanf("%d",&l);

printf("\n");


}

2006-01-05 16:42
feverxx
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2005-12-20
收藏
得分:0 

另外,可再修改一下加深理解:
int main()
{
char a,b,c,d,e;
int i,j,k,l,m;

printf("Name: ");
scanf("%c",&a);
printf("Result: ");
scanf("%c",&i);

printf("\n");

printf("Name: ");
scanf("%c",&b);
printf("Result: ");
scanf("%c",&j);

printf("\n");

printf("Name: ");
scanf("%c",&c);
printf("Result: ");
scanf("%c",&k);

printf("\n");


printf("Name: ");
scanf("%c",&c);
printf("Result: ");
scanf("%c",&l);

printf("\n");


}
在执行scanf("%d",&i)时应当是把“\n"当作下一个空字符保存到输入域,然后执行scanf("%c",&b);时“\n"直接赋值到b.

2006-01-05 16:47
天使预备役
Rank: 2
等 级:论坛游民
威 望:3
帖 子:670
专家分:10
注 册:2004-4-6
收藏
得分:0 
以下是引用我爱我家在2005-12-19 22:35:00的发言:
这句 printf("%s","Enter Name: ");


为什么输出时 , 还要用 "%s"

可以不用!和只写一个参数是一样的效果!


差点把你忘了...
2006-01-05 18:28
快速回复:[求助] C语言高手来指点一下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022054 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved