C语言复习:
我在使用git工具利用Dev-C++的gcc编译器对我写的一个c文件进行编译、执行时,结果让我惊呆了!
因此在这里做一个记录,描述三个问题。
问题描述:
我写了这么一个c文件,目的是为了验证两个问题:
- 数组长度是否可以为一个变量
- 该数组能否被初始化
具体代码是这样的:
#include <stdio.h>
int main()
{
int len = 5;
char array1[len];
char i;
printf("please input string:\n");
scanf("%s",array1);
printf("output string:\n");
printf("%s\n",array1);
return 0;
}
很神奇竟然通过了编译,看一下运行结果:
那么既然编译通过就说明数组长度在当前编译环境和C语言标准下是可行的,但是我还没有开始验证第二个问题的时候,这附带的一个问题出现了,从图中可以看出,我在git上运行程序后,竟然是先让我输入,然后才打印。可是这与我写的C程序显然不同呀!
于是记录问题3:scanf先于printf执行
原因分析:
既然在git上执行程序我认为不可思议,那么就换一个工具叭,于是我将代码放到Dev-C++里进行编译执行,很神奇,它又可以了!来看看结果~
解决方案:
于是我找了一下网上的资料,问题3的解决方法有两个:
- 设置缓冲区为空;
- 在printf执行之后,强制刷新缓冲区。
具体方法如下:
- 在printf之前添加:setvbuf(stdout,NULL,_IONBF,0); 设置缓冲区为空。
- 在每句printf之后添加:fflush(stdout);
代码如下:
方式1:
#include <stdio.h>
int main()
{
setvbuf(stdout,NULL,_IONBF,0);
int len = 5;
char array1[len];
char i;
printf("please input string:\n");
scanf("%s",array1);
printf("output string:\n");
printf("%s\n",array1);
return 0;
}
方式2:
#include <stdio.h>
int main()
{
int len = 5;
char array1[len];
char i;
printf("please input string:\n");
fflush(stdout);
scanf("%s",array1);
printf("output string:\n");
printf("%s\n",array1);
return 0;
}
关于问题2,经过测试后,不能对该数组进行初始化(数组长度为一个变量的前提下),程序编译时会报错: