鱼C论坛

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

question?

[复制链接]
发表于 2012-4-8 03:56:54 | 显示全部楼层 |阅读模式

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

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

x
void main()
{
  char a[40], *pa, *pb, b[40];
  pa=a;
  pb=b;
  printf("please in input:");
  scanf("%s",pa);
  for(;*pa!='\0';pa++,pb++)
     *pb=*pa;

  *pb='\0';
  printf("%s\n",b);
}
why I input string:  fishc is cool.
only come out :  fishc
send time
I input string: today is  good.
only come out: today


小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-8 08:25:50 | 显示全部楼层
You can use gets(pa); to replace scanf("%s",pa);
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-4-8 09:02:51 | 显示全部楼层
I try "gets(pa); "  
It shows: /tmp/ccgk56eC.o: In function `main':
po.c:(.text+0x3a): warning: the `gets' function is dangerous and should not be used.
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-8 10:07:09 | 显示全部楼层
C语言在接受字符串的时候,如果用scanf来接收的话,字符串中不能含有空格,否则将以空格作为串的结束符。如果你键入得是hello world 那么实际上scanf只能获取hello这个单词。所以要接收空格的话可以用gets()这个函数。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-4-8 12:17:55 | 显示全部楼层
我用“gets(pa)"试过了。不过通过。warning: the `gets' function is dangerous and should not be used.
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-4-8 12:18:36 | 显示全部楼层
我用“gets(pa)"试过了。不过通过。warning: the `gets' function is dangerous and should not be used.
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-4-8 12:19:11 | 显示全部楼层

我用“gets(pa)"试过了。不过通过。warning: the `gets' function is dangerous and should not be used.
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-8 12:39:15 | 显示全部楼层
void main()
{
  char a[40], *pa, *pb, b[40];
  pa=a;
  pb=b;
  printf("please in input:");
  gets(pa);
  for(;*pa!='\0';pa++,pb++)
     *pb=*pa;

  *pb='\0';
  printf("%s\n",b);
}



这样啊!  我可以呢!
scanf只能够接受单词,碰到空格就结束了
而    gets是接受一个字符串,直到碰到 回车 或者 缓冲区被存满!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-8 15:01:10 | 显示全部楼层
void main()
{
  char a[40], *pa, *pb, b[40];
  pa=a;
  pb=b;
  printf("please in input:");
  //scanf("%s",pa);
  gets(pa);
  for(;*pa!='\0';pa++,pb++)
     *pb=*pa;

  *pb='\0';
  printf("%s\n",b);
}
输入时有空格会被默认为第二个参数
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-8 19:28:42 | 显示全部楼层
呵呵,还能在这里练习英文...
函数gets确实很危险,容易导致缓冲区溢出攻击
所以实际使用的时候一般用
#include <stdio.h>
char *fgets( char *str, int num, FILE *stream );
来取代它,这里参数FILE *stream 填stdin。主要区别在于fgets的参数不仅含有字符串存储地址,还含有字符串最大长度,因此可以避免缓冲区溢出攻击
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-4-8 21:33:17 | 显示全部楼层
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x50)[0x62c2d0]
/lib/tls/i686/cmov/libc.so.6(+0xe227a)[0x62c27a]
./po[0x804852b]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x560bd6]
./po[0x8048411]
======= Memory map: ========
00304000-00321000 r-xp 00000000 08:01 10092569   /lib/libgcc_s.so.1
00321000-00322000 r--p 0001c000 08:01 10092569   /lib/libgcc_s.so.1
00322000-00323000 rw-p 0001d000 08:01 10092569   /lib/libgcc_s.so.1
0044b000-00466000 r-xp 00000000 08:01 10096756   /lib/ld-2.11.1.so
00466000-00467000 r--p 0001a000 08:01 10096756   /lib/ld-2.11.1.so
00467000-00468000 rw-p 0001b000 08:01 10096756   /lib/ld-2.11.1.so
0054a000-0069d000 r-xp 00000000 08:01 10227155   /lib/tls/i686/cmov/libc-2.11.1.so
0069d000-0069f000 r--p 00153000 08:01 10227155   /lib/tls/i686/cmov/libc-2.11.1.so
0069f000-006a0000 rw-p 00155000 08:01 10227155   /lib/tls/i686/cmov/libc-2.11.1.so
006a0000-006a3000 rw-p 00000000 00:00 0
00c0c000-00c0d000 r-xp 00000000 00:00 0          [vdso]
08048000-08049000 r-xp 00000000 08:01 12062002   /home/cool/po
08049000-0804a000 r--p 00000000 08:01 12062002   /home/cool/po
0804a000-0804b000 rw-p 00001000 08:01 12062002   /home/cool/po
09b2b000-09b4c000 rw-p 00000000 00:00 0          [heap]
b7751000-b7752000 rw-p 00000000 00:00 0
b7761000-b7765000 rw-p 00000000 00:00 0
bfce1000-bfcf6000 rw-p 00000000 00:00 0          [stack]
Aborted

yep. This is what I get. when I use "gets(pa)" .

小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-12 15:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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