C | C语言学习(三)输入数据、输出数据、类型转换、数组、char数组和字符串、字符串长度

一、从标准输入设备读取数据 (# 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

猜你喜欢

转载自blog.csdn.net/weixin_39766005/article/details/108102064