免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2101 | 回复: 11
打印 上一主题 下一主题

关于屏幕输入问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-04 15:39 |只看该作者 |倒序浏览

  1. #include <stdio.h>
  2. #include <string.h>

  3. #define FORMAT "%d\n%s\n%d"

  4. int main(int argc, char *argv[])
  5. {

  6.         struct wodetian
  7.         {
  8.                 int num;
  9.                 char name[20];
  10.                 int assignment;
  11.         };
  12.         struct wodetian sina;
  13.         char *text = sina.name;
  14.         fputs("Please enter the name of the students: ", stdout);
  15.         fflush(stdout);

  16.         if(fgets(text, sizeof text, stdin)!=NULL)
  17.         {
  18.                 char * newline = strchr(text, '\n');

  19.                 if (newline!=0)
  20.                 {
  21.                         *newline = '\0';
  22.                 }
  23.                 sina.num=0;
  24.                 sina.assignment=100;

  25.                 printf(FORMAT, sina.num, text, sina.assignment);
  26.         }       
  27.         return 0;
  28. }

复制代码


为何,我无论输入多少个,都是只显示3个字符?

论坛徽章:
0
2 [报告]
发表于 2007-02-04 15:48 |只看该作者
我的天,你竟然拿 text 去做 sizeof 运算
改成 sizeof (sina.name)

论坛徽章:
0
3 [报告]
发表于 2007-02-04 15:51 |只看该作者
这是为什么呢?
char *text = sina.name;
不就是
char *text;text = sina.name;

论坛徽章:
0
4 [报告]
发表于 2007-02-04 15:53 |只看该作者
你那里指针长度是4个bytes,你看到“只显示3个”,想想剩下的那个干什么去了吧
text 和 sina.name本来就是两样东西,赋值也只是赋给text值,值的内容是 sina.name的首字节地址,天知道 text指向的区域分配了多少字节

[ 本帖最后由 namei 于 2007-2-4 15:59 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-02-04 15:55 |只看该作者
还有,如下代码

  1. #include <stdio.h>

  2. int main(int argc, char * argv[])
  3. {
  4.         char text[5];
  5.         fputs("Enter some characters: ", stdout);
  6.         fflush(stdout);
  7.         int x = sizeof text;
  8.         fgets(text, x, stdin);
  9.                
  10.         printf("text=\"%s\"\n%d", text, x);
  11.        
  12.         return 0;
  13. }

复制代码


为何只能从屏幕输入4个字符,奇怪
运行情况如下

  1. Enter some characters: wokao
  2. text="woka"
  3. 5
复制代码

论坛徽章:
0
6 [报告]
发表于 2007-02-04 15:57 |只看该作者
字符串结尾 '\0' 占一字节

论坛徽章:
0
7 [报告]
发表于 2007-02-04 16:01 |只看该作者
原帖由 namei 于 2007-2-4 15:57 发表
字符串结尾 '\0' 占一字节

编译器自己加的吗?

这样为什么就就就可以了捏大哥:

  1. #include <stdio.h>

  2. int main(int argc, char * argv[])
  3. {
  4.         char text[5];
  5.         fputs("Enter some characters: ", stdout);
  6.         fflush(stdout);
  7.                 scanf("%s", text);
  8.                
  9.         printf("text=\"%s\"\n", text);
  10.        
  11.         return 0;
  12. }

复制代码


结果如下:


  1. Enter some characters: wokaoni
  2. text="wokaoni"
复制代码

[ 本帖最后由 wodetian 于 2007-2-4 16:02 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2007-02-04 16:04 |只看该作者
原帖由 namei 于 2007-2-4 15:53 发表
你那里指针长度是4个bytes,你看到“只显示3个”,想想剩下的那个干什么去了吧
text 和 sina.name本来就是两样东西,赋值也只是赋给text值,值的内容是 sina.name的首字节地址,天知道 text指向的区域分配了多少 ...

这个说得太好了,哎,代码写得少,不太敏感,虽然千百遍知道,但到用时就忘

论坛徽章:
0
9 [报告]
发表于 2007-02-04 16:06 |只看该作者

回复 7楼 wodetian 的帖子

这样就溢出了
你正在做的事是往5个字节大小的数组中填8个字节的数据

[ 本帖最后由 namei 于 2007-2-4 16:08 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2007-02-04 16:09 |只看该作者
原帖由 namei 于 2007-2-4 16:06 发表
这样就溢出了
你正在做的事是往5个字节大小的数组中填8个字节的数据

那怎么还行的,奇怪了,偶用gcc编译的,没有报错啊什么的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP