鱼C论坛

 找回密码
 立即注册
查看: 4029|回复: 10

帮我看看怎么回事,输入名字后就把后面的跳过了

[复制链接]
发表于 2012-2-23 20:54:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>


  2. #include <stdio.h>
  3. void main()
  4. {
  5. struct data
  6. {
  7. int year;
  8. int month;
  9. int day;
  10. };

  11. struct
  12. {
  13. char name;
  14. int age;
  15. struct data birthday;
  16. }plj;

  17. printf("input your name :\n");
  18. scanf("%c",&plj.name);

  19. printf("input your age :\n");
  20. scanf("%d",&plj.age );

  21. printf("input your birthday the-year :\n");
  22. scanf("%d",&plj.birthday.year );

  23. printf("input your birthday the-month :\n");
  24. scanf("%d",&plj.birthday.month);

  25. printf("input your birthday the-day :\n");
  26. scanf("%d",&plj.birthday.day);



  27. printf("plj's birthday is %d-%d-%d\n", plj.birthday.year, plj.birthday.month, plj.birthday.day);


  28. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-24 15:40:47 | 显示全部楼层
本帖最后由 风扫地 于 2012-2-24 15:42 编辑

char name;  你的名字似乎只有一个字符?

建议改成  char  name[10];     

struct
{
char name[20];
int age;
struct data birthday;
}plj;


scanf("%s",plj.name);
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-27 09:01:19 | 显示全部楼层
输入之前清空缓冲区
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-27 10:51:33 | 显示全部楼层
本帖最后由 Love 梦想 于 2012-2-27 10:52 编辑

LZ  给你看看我的学习笔记:

2 当连续使用两个以上scanf();函数时,它会无法中断程序等待输入
如:
#include <stdlib.h>
#include <stdio.h>
int main()
{
    char a,b,c;
    puts("请输入第一个");
    scanf("%c",&a);
    puts("请输入第二个");
    scanf("%c",&b);  // 这个会直接忽略跳过
    puts("请输入第三个");
    scanf("%c",&c);
    printf("第一个【%c\n第二个【%c\n第三个【%c\n",a,b,c);     
    system("pause");
    }
当我们输入第一个时,它就会直接忽略第二个scanf函数 跳到第三个scanf函数中断程序 实际上我们只输入了 两个数据 分别赋值给第一个和第三个变量
改进此问题可利用fflush(stdin); 此句代码功能是清除一个流,利用它来清空由第一个数值所带来的残留数据,改进代码:
#include <stdlib.h>
#include <stdio.h>
int main()
{
    char a,b,c;
    puts("请输入第一个");
    scanf("%c",&a);
    puts("请输入第二个");
    fflush(stdin);
    scanf("%c",&b);
    puts("请输入第三个");
    fflush(stdin);
    scanf("%c",&c);
    printf("第一个【%c\n第二个【%c\n第三个【%c\n",a,b,c);
      
    system("pause");
    }
又或者加一个在%号之前加个空格来清除一个流
如:
#include <stdlib.h>
#include <stdio.h>
int main()
{
    char a,b,c;
    puts("请输入第一个");
    scanf("%c",&a);//此处输入:I love you!
    puts("请输入第二个");
    scanf(" %c",&b);  // %号前面多了个空格
    puts("请输入第三个");
    scanf(" %c",&c);  // %号前面多了个空格
    printf("第一个【%c\n第二个【%c\n第三个【%c\n",a,b,c);      
    system("pause");
    }

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-6 21:49:20 | 显示全部楼层
#include <stdio.h>


#include <stdio.h>
void main()
{
struct data
{
int year;
int month;
int day;
};

struct
{
char name;
int age;
struct data birthday;
}plj;

printf("input your name :\n");
scanf("%s",&plj.name);

printf("input your age :\n");
scanf("%d",&plj.age );

printf("input your birthday the-year :\n");
scanf("%d",&plj.birthday.year );

printf("input your birthday the-month :\n");
scanf("%d",&plj.birthday.month);

printf("input your birthday the-day :\n");
scanf("%d",&plj.birthday.day);



printf("plj's birthday is %d-%d-%d\n", plj.birthday.year, plj.birthday.month, plj.birthday.day);


}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-7 10:56:37 | 显示全部楼层
没有啥错误啊!只是看到应该改为char  name[10] 名字不是一个字符。后面也要该成scanf("%s",&plj.name);
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-12 16:26:38 | 显示全部楼层

把你笔记改下吧
fflush没有这种fflush(stdio)用法
就while(getchar()!='\n');是最方便的
还有种清理缓冲区是scanf里的正则表达式匹配非换行的最后保留个换行
一般就用while(getchar()!='\n');
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-13 20:37:12 | 显示全部楼层
ccqiji 发表于 2012-3-12 16:26
把你笔记改下吧
fflush没有这种fflush(stdio)用法
就while(getchar()!='\n');是最方便的

有没有这种 用法 你试试就知道
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-13 22:53:18 | 显示全部楼层
system("pause")有什么作用啊?求解答!!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-14 00:01:07 | 显示全部楼层
Love 梦想 发表于 2012-3-13 20:37
有没有这种 用法 你试试就知道

fflush只对当前是写并且下句代码是读时有意义
fflush(stdout)清除输出流的缓冲区
你试试void main()也可以运行程序
你要这样写我也没办法 毕竟谭浩强让千千万万学子们进入新手编程境界
  1. C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux下的gcc就不支持,经我的GCC4.6.2测试),因为标准中根本没有定义 fflush(stdin)。   MSDN 文档里也清楚地写着:   fflush on input stream is an extension to the C standard (fflush 操作输入流是对C标准的扩充)。   以下是 C99 对 fflush 函数的定义:   int fflush(FILE *stream);   如果stream指向输出流或者更新流(update stream),并且这个更新流最近执行的操作不是输入,那么fflush函数将把任何未被写入的数据写入stream指向的文件(如标准输出文件stdout)。否则,fflush函数的行为是不确定的。fflush(NULL)清空所有输出流和上面提到的更新流。如果发生写错误,fflush函数会给那些流打上错误标记,并且返回EOF,否则返回0。   由此可知,如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。故而使用 fflush(stdin) 是不正确的。
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-15 19:20:55 | 显示全部楼层
楼主你第二十二行有问题s canf("%c",&plj.name);,应该把%c 改成%s
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-27 02:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表