C语言中意想不到的地方——第七周作业
C语言中意想不到的地方
最近,知道了一些C语言中很奇怪的情况,或者说是让人意向不到的地方吧,就在这里分享给大家。
程序一
#include"stdio.h"
int main(){
char st[5];
printf("input a string:\n");
scanf("%s",st);
printf("%s\n",st);
return 0;
}
在这个程序里,经凭借眼睛看,你认为st最多可以接受多少字符?5个?4个?在程序最多输入几个字符?同样是和st接受的字符相同?
但是实际的结果可能要让你失望了,都不是。你可以在你的编译器实验一下,会有让你意想不到的结果。当让不同的编译器之间的结果也会有所不同。我分别在Microsoft visual C++和Dev C++中尝试了一下。
visual C++中当输入的数字数目不大于9时程序都够正常运行,如图1,但是大于或等于9时虽然任然能够将输入的字符打印出来,却会出现一个对话框显示“出现了一个问题,导致程序停止正常工作。请关闭程序”如图2所示。
图1 程序一在visua C++l中正常运行 图2 程序一在visual C++中运行异常
在Dev C++中当输入字符小于等于16时能够正常运行,如图3所示,等于17时会再次让你输入字符,如图4所示。大于17时虽然任然能够将输入的字符打印出来,却会出现一个对话框显示“出现了一个问题,导致程序停止正常工作。请关闭程序”如图5所示。
图3 程序一在Dev C++中正常运行 图4 程序一在Dev C++中运行异常1
图5 程序一在Dev C++中运行异常2
其实这样的程序是错误的,要避免这个问题,可以将程序改成如下,就不会出现之前的问题了。
#include "stdio.h"
int main(){
char ch[5];
printf("input a string\n");
for(int i=0;i<4;i++)
scanf("%c",&ch[i]);
ch[4]='\0';
printf("%s\n",ch);
return 0;
}
程序二
#include "stdio.h"
#include
int main(){
char st[5],t[]="1234567890123";
strcpy(st,t);
printf("%s\n",st);
scanf("%s",t);
printf("%s\n",t);
return 0;
}
在这个程序中一样打印出来的st并不是想像中的那样,而是将数组t中的内容全部打印出来了。而对于接下来的操作不同的编译器呈现出来的结果是不一样的。
在Visual C++中接下来只要输入字符就会出现一个对话框显示“出现了一个问题,导致程序停止正常工作。请关闭程序”虽然也能答应出来,如图6所示。
图5 程序二在visual C++中运行异常
在Dev C++中当输入的字符数小于或等于46时,能够正常运行,如图7所示。并没有任何异常,而当输入的数目等于47时打印出来之后可以再次输入,如图8所示。当输入的字符大于47时虽然也能将输入的数据打印出来,但是会出现“出现了一个问题,导致程序停止正常工作。请关闭程序”的提示,如图9所示。
图7 程序二在Dev C++中正常运行 图8 程序二在Dev C++中运行异常1
图9 程序二在Dev C++中运行异常2/p>
变换程序
1、将代码第4行改为:
char t[]="1234567890123",st[5];
会发现在visual C++中输入字符小于等于16时,能够正常运行,如图10所示。输入字符大于17时,会出现“出现了一个问题,导致程序停止正常工作。请关闭程序”的提示,如图11所示。
图10 程序二变换程序1在visual C++中正常运行 图11 程序二变换程序1在visual C++中运行异常
2、将第7行的代码注释掉,会发现输出的t并不是我们想要的:1234567890123。在visual C++中输出90123如图12所示,在Dev C++中输出67890123如图13所示。
图12 程序二变换程序2在visual C++中运行 图13 程序二变换程序2在Dev C++中运行
程序三
#include "stdio.h"
#include "string.h"
int main(){
char *field="abcd";
char s[6];
for(int i=0;i<strlen(field);++i)
{
s[i]=field[i];
}
printf("%s\n",s);
}
在该程序中打印出来的结果并不是想要的abcd,在DevC++中在abcd后会随机的出现一个字符。 如图14,15所示为两次运行的结果。
图14 程序三在Dev C++中第一次运行 图15 程序三在在Dev C++中第二次运行
以上三个的问题出现的主要的原因都是由于堆栈被破坏或者是没能理解堆栈分配问题造成的。