#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
答案 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