详解while((ch=getchar())!=‘\n’)

存在以下代码:

1
2
3
4
5
6
7
8
#include<stdio.h>
int main(){
char ch;
while((ch=getchar())!='\n'){
putchar(ch);
}
return 0;
}

当我在键盘输入:forever时并用回车结尾

显示屏上也会输出forever

这样的输出结果有一定原因:

  • getchar()函数时会从缓冲标准输入流stdin里面取一个字符,而不是直接从键盘输入。
  • (ch=getchar())!='\n'作为循环条件,即ch如果从stdin里面取到的字符不是回车,就继续从stdin再取。

C语言中定义int变量,默认值是多少?

区分变量的类型,有两种情况:

  • 局部变量

    局部变量在没有显示初始化时,其值C语言规范没做要求,可以是随机值

  • 全局变量或静态局部变量

    所有的全局变量,即定义在函数外的变量,默认值为0。

    所有的静态局部变量,即定义在函数内部的(eg:static int a)形式的,默认值为0。

scanf()函数的定义

函数 scanf() 是从标准输入流stdio (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。

定义二维数组时,为什么二维数组行可省列不可省

合法的二维数组定义:

1
int array[][3];

不合法的二维数组定义:

1
int array[3][]

可以把二维数组看成是若干个等长的一维数组的集合,如果列数省略了,编译器就不知道你到底要定义几个、多长的一维数组的集合,所以列数不能省,对应的,如果行数省略了,编译器通过你指定的列数,可以对应的计算出二维数组的行数,自动帮你设置,所以行数是可以省的,列数是不能省的。

原文链接

VS2019 C语言,在一个项目中添加多个包含main函数的源文件并分别调试运行

移除不使用的文件

image-20221006152059220

VS2019如何调试C语言程序

  • image-20221006154800623

  • F11单步调试

    image-20221006155056878

为什么%f和%Lf出来结果的小数位数一样?

在c primer中写道:

image-20221009173930949

有如下代码,在编译器输出时输出如下,于是我产生了疑问:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define _CRT_SECURE_NO_WARNINGS 1;
/* showf_pt.c -- 以两种方式显示float类型的值 */
#include<stdio.h>
int main(void)
{
float aboat = 32000.0;
double abet = 2.14e9;
long double dip = 5.32e-5;

printf("%f can be written %e\n", aboat, aboat);
// 下一行要求编译器支持C99或其中的相关特性
printf("And it's %a in hexadecimal, powers of 2 notation\n", aboat);
printf("%f can be written %e\n", abet, abet);
printf("%Lf can be written %Le\n", dip, dip);

return 0;
}

image-20221009174418471

为什么%f%Lf输出的小数位数一样呢?于是我更改了输出格式,

image-20221009174618138

不同数据类型存储的小数的精度可以看出来了

image-20221009174728673

scanf函数使用%d格式给char类型变量赋值

有如下代码:

1
2
3
4
5
6
7
8
9
10
#define _CRT_SECURE_NO_WARNINGS 1;
/* 输入ASCII码值打印对应字符 */
#include<stdio.h>
int main(void)
{
char c;
scanf("%d", &c);
printf("%c", c);
return 0;
}

输入65之后IDE报错:Run-Time Check Failure #2 - Stack around the variable 'c' was corrupted.,大意是指访问的内存越界了。

问题解决:

char换成int之后程序不再报错,应该是scanf函数把字符型变量c当成了整型赋值,而整型的内存空间是大于字符型的,所以导致内存访问越界。

getchar()函数和getch()函数的异同

当程序调用getchar时.程序就等着用户按键。用户输入的字符被存放在键盘缓冲区中。直到用户按回车为止(回车字符也放在缓冲区中)。

getch与getchar基本功能相同,差别是getch直接从键盘获取键值,不等待用户按回车,只要用户按一个键,getch就立刻返回,getch返回值是用户输入的ASCⅡ码,出错返回-1。

百度百科

VisualStduio2019 C++如何重定向(用文件输入输出)

启动设置:

image-20221110162446681

资源文件位置被指定了:

image-20221110162604829

c语言优先级

优先级 运算符 结合律
1 后缀运算符:[] () · -> ++ --(类型名称){列表} 从左到右
2 一元运算符:++ – ! ~ + - * & sizeof_Alignof 从右到左
3 类型转换运算符:(类型名称) 从右到左
4 乘除法运算符:* / % 从左到右
5 加减法运算符:+ - 从左到右
6 移位运算符:<< >> 从左到右
7 关系运算符:< <= > >= 从左到右
8 相等运算符:== != 从左到右
9 位运算符 AND:& 从左到右
10 位运算符 XOR:^ 从左到右
11 位运算符 OR:| 从左到右
12 逻辑运算符 AND:&& 从左到右
13 逻辑运算符 OR:|| 从左到右
14 条件运算符:?: 从右到左
15 赋值运算符: = += -= *= /= %= &= ^= |= <<= >>= 从右到左
16 逗号运算符:, 从左到右

scanf,printf输入输出float和double型数据

  1. printf的%f说明符既可以输出float型又可以输出double型。
  2. scanf对于float类型必须用%f,double必须用%lf
  3. 事实上,printf中没有定义%lf,但是很多系统可能会接受它。要确保可移植性,就要坚持使用%f。

在VS中添加命令行参数argv[]

菜单[项目] -> 属性页 -> 配置属性 -> 调试
在[命令行参数]里填上即可。

image-20221127182003067