***堆栈粉碎检测*** //试图打印一个字符

时间:2016-10-30 15:44:16

标签: c arrays

#include <stdio_ext.h>
#include <stdlib.h>
int main() 
{
  char a[10],c[10];
  int i,b;

  b=1;
  i=0;

  printf(": ");
  scanf("%s",a);
  fflush(stdin);
  __fpurge(stdout);

  while(i<=10)
  {

    c[i]=a[i]+b;
    i++;

  }
  printf("%s",c);
  return (EXIT_SUCCESS);
}

所以问题是我想用 ASCII表中的下一个字符打印一个字符,但是每次运行它都会出现这个错误,虽然它看起来大小为10 :

: asdf
*** stack smashing detected ***: /home/polo/Escritorio/ejemplo/dist/Debug/GNU-Linux/ejemplo terminated
bteg� c8�l�#w�@���
RUN FINISHED; Aborted; core dumped; real time: 4s; user: 0ms; system: 0ms

1 个答案:

答案 0 :(得分:3)

 while(i<=10)

你是off-by one。它应该是

 while( i < 10 )

因为C数组使用基于0的索引。

据说C11,第7.21.5.2章

  

如果stream指向输出流或最新的输出流   如果没有输入操作,fflush函数会导致该流的任何未写入数据   要传递到主机环境以写入文件; 否则,行为是   未定义。

所以,不要fflush(stdin),从技术上讲,它会调用undefined behavior

最后,scanf("%s",a);为缓冲区溢出打开了潜在。限制输入缓冲区长度,如

 scanf("%9s",a); //when a is an array of size 10