最近编写程序的时候一直被数据的输入输出所困扰,由此写篇博文总结一下最近遇到的问题和解决方法,错误之处望指正。

1.数组使用的一些语法注意事项

(1)数组的定义

一维数组:类型名  数组名 [常量表达式]

常量表达式中可以包括常量和符号常量,如int a[3+5]合法,int [a]不合法,即C语言不允许对数组的大小进行动态定义。

如果在被调用函数中(不包括主函数)定义数组,其长度可以是变量或者是非常量表达式,如:

void fun(int n)
{int a[2*n].............
}

在调用fun函数时,形参n从实参得到值,这种情况被称为“可变长数组”,允许在每次调用fun函数时,n有不同的值。但是在执行的时候,n的值是不可变的,数组长度是固定的。如果指定数组为静态(static),存储方式,则不能使用“可变长数组”,如static int a[2*n],不合法。

二维数组:类型名  数组名 [常量表达式][常量表达式]

int arr[3][4],可以把arr[0],arr[1],arr[2],看成是数组名,即二维数组可以理解为数组的数组

(2)数组的初始化

定义数组的时候赋初值,并指定数组的长度:int arr[5] = {1,2,3,4,5}

定义数组的时候赋初值,不指定数组的长度,此时系统会根据初值的个数确定数组的长度,int arr[] = {1,2,3,4,5},数组的长度为5

定义数组的时候赋部分值:int arr[5] = {1,2},只给前二个赋值,系统会自动给后面三个赋初值为0,此时如果将数组里面的数据打印出来的话,打印的结果是12000。

定义数组时,如果已经定义了数组的长度并对之初始化,凡未被初始化的部分,系统会自动初始化,整型数组初始化为0,字符型数组初始化为'\0',指针数组为NULL。

二维数组初始化的几种形式,int arr[2][3] = {{1,2,3},{4,5,6}},int arr[2][3] = {1,2,3,4,5,6},int arr[2][3] = {{1},{2}}(未被初始化的部分自定义为0),int arr[2][3] = {{1}}

注意:如果全部元素都被赋初值,则定义数组时对第一维数组的长度可以不指定,但是第二维数组的长度不能省

2.字符数组使用中的语法注意

(1)字符数组的结束标志

C语言规定字符数组的结束标志为'\0',这个字符不算数组的有效长度中去,'\0',在ASCII码为0。

例如输出一个字符串,printf("I am happy\n");,在内存中存储时,系统会自动的在'\n'的后面加上一个'\0',在执行printf函数时,每输出一个字符检查一次,看下一个字符是否为'\0',遇到'\0'的时候停止输出。

(2)字符数组初始化

       char ch[10] = {'I',' ','a','m',' ','h','a','p','p','y'};

如果字符的个数大于字符数组的长度,则语法错误,如果初始化字符的个数,小于数组的长度,系统会自动补'\0'

       char ch[] = {'I',' ','a','m',' ','h','a','p','p','y'};

如果定义时长度不确定,系统会根据初始化的字符个数确定数组长度,此时数组的长度为10,如果我们以字符串的形式同样的输入上面的字符,则数组的长度不是10,而是11,因为系统会自动的在后面加上'\0'。下面截图可以看出单个字符和字符串初始化数组的区别

但是此时如果用printf("%s",arr1),将数组打印出来时,'\0'是不会被打印出来的

3.缓冲区和数组的输入输出问题

(1)逐个字符的输入和输出用"%c",字符串的输入和输出用"%s",如scanf("%s",arr);此时输入字符串时,输入的字符串的长度应该小于已经定义的字符数组的长度,因为系统会自动的不'\0',如果是单个字符输入时,输入的数据的长度可以是定义的字符数组的长度。如果利用一个scanf()输入多个字符串,输入时应该以空格隔开如

      char str1[5],str2[5],str3[5];scanf("%s%s%s",str1,str2,str3);

如果此时输入"how are you",系统会分别把“how”,“are”,"you",赋值给str1,str2,str3

注意:如果编写以下程序,则不会达到想要的结果

     char str[13];scanf("%s",str);

此时如果输入"how are you",由于系统把空格当做是输入字符串之间的空格符,因此只讲空格前面的"how"赋值给了str,其余的部分补'\0'。还应该注意的是,scanf的输入项中如果是字符数组名,不要在前面加&,因为C语言中,数组名代表的就是数组的首地址,如果我们使用printf("%o",str),此时是用八进制输出数组str的首地址。

在使用VS2013时,系统为了更加安全会让你使用scanf_s,此时的用法和scanf略有不同,不只需要传数组名还需要传入输入字符串的长度如下

      char arr[10];scanf_s("%s",arr,10);

注意: 此时仍需要保证输入的字符串的长度小于定义的字符数组的长度,如果输入字符的个数超过数组的长度,就会把数组撑爆了,此时的scanf_s的返回值为0,如果用printf打印的话,则打印不了。,输入字符的个数最大还应该比数组长度小1,因为系统会自动补'\0'。使用gets_s函数时的用法相类似,gets(arr,10)。

注意:gets_s()使用时,就不存在用空格作为字符串的分隔符,如下

     char arr[10];gets_s(arr,10);

如果此时输入“hello ha”此时arr中存储的就是“hello ha\0\0”

(2)一些常见的字符串处理函数(字符串处理函数时,应包含头文件<string.h>)

puts(str):字符串输出函数

gets(str):字符串输入函数,返回值是str的起始地址(put和gets只能输入输出一个字符串)

strlen(str):测量字符串长度函数,测试结果是字符串的实际长度,不包括'\0'

strcmp(str1,str2):字符串比较函数,比较规则是,将两个字符串自左到右逐个比较(按ASCII码值大小比较),直到出现不同的字符或者遇到'\0'为止,如果相等返回0,如果str1>str2返回一个正整数,否则返回一个负整数
      (3)字符输入和输入缓冲区的问题

先说两个单个字符的输入和输出函数getchar(),putchar(),具体用法不在熬述。先看下面的程序

(未完待续,对不起)

缓冲区和数组的输入输出问题相关推荐

  1. C/C++字符数组的输入输出方式详解

    字符是C/C++读入数据最主要的类型.本篇将介绍单个字符数组/多个字符串及二维数组的输入输出方式与相关函数. 目录 单个字符串处理 ​编辑 输入 逐个元素输入 整体串形式输入 输出 逐个输出 整体串形 ...

  2. C语言文件与数组之间输入输出操作

    C语言文件与数组之间输入输出操作 文件存到数组里面: #include<iostream> #include<fstream> #include<string> # ...

  3. java二维数组输入_java 二维数组的输入输出问题

    java 二维数组的输入输出问题 有一个二维数组 里面包含了很大的数字.我要把它通过输出流存储在.dat文件中 然后在另一个程序中把这些信息读取出来,并且存储在另外一个二维数组中.请问该怎么办?这个数 ...

  4. C语言字符数组的输入输出

    可以在初始定义字符数组时进行赋值,例如char c[]={"China"}; 或者用strcpy函数 例如char c[20]; strcpy(c,"China" ...

  5. 在java中数组的输入与输出_Java 数组的输入输出

    Java中要对控制台进行输入操作的话要调用Scanner类,定义一个扫描的对象,例: //要导入java.util.Scanner;Scanner scanner = new Scanner(Syst ...

  6. Java 数组的输入输出

    Java中要对控制台进行输入操作的话要调用Scanner类,定义一个扫描的对象,例: //要导入java.util.Scanner; Scanner scanner = new Scanner(Sys ...

  7. C语言字符数组的输入输出处理

    字符数组就是char数组,当维度是一维是可以当做"字符串",当维度是二维时可以当成是字符串数组,即若干字符串.字符数组的输入除了使用scanf外,还可以使用getchar或者get ...

  8. C语言指针数组介绍,定义指针数组,输入输出指针数组

    指针数组 1.什么是指针数组: (1)数组里面的每一个元素不是值而是指针. (2)把很多的指针集合在一起,就是一个指针数组 2.定义一个指针数组: 类型标识符 *数组名[长度]: 比如:int *a[ ...

  9. Java中数组的输入输出

    数组的输入 首先声明一个int型数组 int[] a 或者 int a[] 给数组分配空间 a=new int[10]; 和声明连起来就是int[] a=new int[10]; 或者是 int a[ ...

最新文章

  1. MySQL 的 find_in_set函数使用方法
  2. 技术04期:关于神经网络的概念及技术领域
  3. 深度特征合成与遗传特征生成,两种自动特征生成策略的比较
  4. python列表知识点_Python列表List基础知识点总结
  5. DayDayUp:博主,在此,祝愿大家(十五种编程语言输出),2019年春节快乐!猪年诸事大吉!学要有所成,劳要有所获!
  6. 直方图中最大的矩形(遍历与单调栈)
  7. [转]你每天90%的注意力被浪费了
  8. 关于ssd-tensorlow如何训练自己的数据集合
  9. 李子柒被坑,大厂生气了!字节跳动火速对杭州微念启动撤资
  10. ibatis Clob对象处理
  11. MySQL版本升级5.6到5.7版本
  12. android intent 跳转配置,android 再解Intent,通过配置Action和Data跳转
  13. 【小白冲冲冲!!!】补2:SLAM中最小二乘问题的引入及求解
  14. gitlab一键安装 笔记
  15. idea进入方法快捷键详情大全(idea快捷键大全最新设置)
  16. 小波分解和小波包分解
  17. win64 oracle下载,oracle 11g 64位下载
  18. u盘无法格式化不在计算机中,在电脑中,为什么U盘不能格式化?
  19. 一文读懂局域网、广域网、WLAN、WiFi的联系与区别
  20. 苹果设备的微信数据收集

热门文章

  1. HTML5的viewport使用
  2. python-day05正则表达式
  3. C#条件判断-根据条件判断要走的路-if结构
  4. 从头理解self-attention机制
  5. python的flask实现接口_使用python的Flask实现一个接口mock数据(傻瓜教程)
  6. yii2 模型中set_Day184:人脸识别中open-set与close-set
  7. php thrift 报错,thrift安装遇到的问题以及解决方法(必看篇)
  8. 获取本年、本月、本周时间范围_为什么“增值税期末留抵税额本年累计数”很快就被废止了...
  9. hashmap实现原理_Java中HashMap底层实现原理(JDK1.8)源码分析
  10. Android客户端开发—开源数据库框架LitePal