一、从标准输入设备读取数据 (# include <stdio.h>)
1. 读取数据(通用):scanf通过%转义的方式可以得到用户通过标准输入设备输入的数据。
int num1, num2;
scanf("%d%d", &num1, &num2);//两个数据之间需要用空格或者回车隔开
scanf("%d,%d", &num1, &num2);//两个数据之间需要用,隔开
scanf("%3d%d", &num1, &num2);//输入12345回车,num1=123,num2=45
2. 读取char类型数据:getchar是从标准输入设备读取一个char。
3. 读取字符串char *:
char *gets(char *s);从标准输入设备读入字符,并保存到指定的内存空间,直到出现换行符或读到文件结尾为止。
参数:s:与符串首地址;
返回值:成功:读入的字符串;失败: NULL。
4. 读取文件或者读取从键盘输入的字符串:
char *fgets(char *s,int size,FILE *stream);从stream指定的文件内读入字符,保存到 s 所指的内存空间,直到出现换行字符、读到文件结尾或是已读了 size -1 个字符为止,最后会自动加上字符 '\0' 作为字符串结束。
参数:s:字符串
size:指定最大读取字符串的长度 ( size -1 )
stream:文件针,如果读键盘输入的字符串 , 固定写为 stdin
返回值:成功:成功读取的字符串;
读到文件尾或出错:NULL。
★ gets(str) 与 scanf ("%s",str) 、fgets的区别:
gets(str) :允许输入的字符串含有空格,不包含结尾的"\n",存在缓冲区溢出情况。
scanf ("%s",str):不允许含有空格,不包含结尾的"\n",存在缓冲区溢出情况。
fgets():允许含有空格,(输入个数少于元素个数时)会包含结尾的"\n",并会自动加上字符 '\0' 作为字符串结束,不存在缓冲区溢出情况。
由于 scanf( )和 gets( )无法知道字符串str大小,必须遇到换行符或读到文件结尾为止才接收输入,因此容易导致字符数组越界 ( 缓冲区溢出 ) 的情况。所以我们在定义字符数组时要把数组长度设置的尽可能大。
fgets ( ) 在读取一个用户通过键盘输入的字符串的时候,同时把用户输入的回车也做为字符串的一部分。通过 scanf 和 gets 输入一个字符串的时候,不包含结尾的"\n",但通过 fgets 结尾多了"\n"。 fgets ( ) 函数是安全的,不存在缓冲区溢出的问题。
# include <stdio.h>
#pragma warning(disable:4996)
int main()
{
char ch[20];
gets(ch);//输入:hello world回车
printf("%s", ch);//输出:hello world
scanf("%s", ch);//输入:hello world回车
printf("%s", ch);//输出:hello
}
char ch[20];
fgets(ch, sizeof(ch), stdin);//输入:hello world回车
printf("%s", ch);//输出:hello world回车
char ch1[10];
fgets(ch1, sizeof(ch1), stdin);//输入:hello world回车
printf("%s", ch1);//输出:hello wor
二、输出数据 (# include <stdio.h>)
1. 输出数据(通用):printf通过%转义的方式可以输出数据。
2. 输出char类型数据:putchar可以输出一个char类型数据,参数可以是char类型变量、char字符、整型。结果不会换行。
char c = 'a';
putchar(c);//a
putchar('\n');//换行
putchar('a');//a
putchar('\n');//换行
putchar(97);//a
3. 输出字符串:
int puts(const char *s);
功能:标设备输出字符串,在输出完成后动输出一个"\n"
参数:s:字符串首地址
返回值:
成功:非负数;
失败: -1。
char ch[20] = "hello world";
puts(ch);//输出hello world换行
char ch1[20];
fgets(ch1, sizeof(ch1), stdin);//输入:hello world回车
puts(ch1);//输出hello world换行换行
puts("");//输出换行
4. 将字符串写入到 stream 指的文件中,字符串结束符 " 0' 不写入文件;或者把字符串输出到屏幕上。
int fputs(const char *str,FILE *stream);
参数:str:字符串
stream:文件指针,如果把字符串输出到屏幕 , 固定写为stdout
返回值:
成功: 0
失败:-1
fputs()是 puts()的文件操作版本,但 fputs()不会自动输出一个"\n"
三、类型转换
类型转换的原则:占用内存字节数少 ( 值域小 ) 的类型,向占用内存字节数多(值域大 ) 的类型转换,以保证精度不降低。
四、数组
1. 获取一维数组元素个数:
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int length = sizeof(arr) / sizeof(arr[0]);
2. 获取二维数组行列数:
int arr[][3] =
{
{1,2,3},
{4,5,6}
};
int row = sizeof(arr) / sizeof(arr[0]);//行数
int col= sizeof(arr[0]) / sizeof(arr[0][0]);//列数
printf("行:%d\n列:%d", row, col);
五、char数组和字符串
C语言中没有字符串这种数据类型,可以通过 char数组来替代。字符串一定是一个 char 数组,但 char数组未必是字符串 。数字0(和字符 '\0' 等价)结尾的 char 数组就是一个字符串,但如果 char数组没有以数字 0 结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的 char 的数组。
char ch[] = { 97,98,99,100,0,101 };//6个元素,第五个元素是结束标志\0
printf("%s", ch);//输出abcd
char *ch1 = "hello";//注意有结束标志\0
printf("%s", ch1);//输出hello
char ch2[] = "hello";//6个元素,注意有结束标志\0
printf("%s", ch2);//输出hello
char ch3[] = { 97,98,99,100,101 };//5个元素
printf("%s", ch3);//输出abcde及一堆乱码,因为没有结束标志
char ch4[10] = { 97,98,99,100,101};//10个元素
printf("%s", ch4);//输出abcde
char ch5[10] = { 97,98,99,100,101,102,103,104,105,106 };//10个元素
printf("%s", ch5);//输出abcdefghij及一堆乱码
六、计算字符串长度 (#include <string.h>)
size_t strlen(const char *s);
功能:计算指定字符串的长度 , 不包含字符中结束符"\0"
参数:s:字符串首地址
返回值:字符串的长度,size_t 为 unsigned int 型
char ch[100] = "hello world";
printf("char数组所占字节大小:%d\n", sizeof(ch));//100
printf("字符串长度:%d\n", strlen(ch));//11
char ch1[] = "hello world";
printf("char数组所占字节大小:%d\n", sizeof(ch1));//12,包含\0
printf("字符串长度:%d\n", strlen(ch1));//11