首页 > 缓冲区和数组的输入输出问题

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

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

    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,字符型数组初始化为'',指针数组为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语言规定字符数组的结束标志为'',这个字符不算数组的有效长度中去,'',在ASCII码为0。

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

      (2)字符数组初始化

       char ch[10] = {'I',' ','a','m',' ','h','a','p','p','y'};
              如果字符的个数大于字符数组的长度,则语法错误,如果初始化字符的个数,小于数组的长度,系统会自动补''

       char ch[] = {'I',' ','a','m',' ','h','a','p','p','y'};
              如果定义时长度不确定,系统会根据初始化的字符个数确定数组长度,此时数组的长度为10,如果我们以字符串的形式同样的输入上面的字符,则数组的长度不是10,而是11,因为系统会自动的在后面加上''。下面截图可以看出单个字符和字符串初始化数组的区别

 

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

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

   (1)逐个字符的输入和输出用"%c",字符串的输入和输出用"%s",如scanf("%s",arr);此时输入字符串时,输入的字符串的长度应该小于已经定义的字符数组的长度,因为系统会自动的不'',如果是单个字符输入时,输入的数据的长度可以是定义的字符数组的长度。如果利用一个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,其余的部分补''。还应该注意的是,scanf的输入项中如果是字符数组名,不要在前面加&,因为C语言中,数组名代表的就是数组的首地址,如果我们使用printf("%o",str),此时是用八进制输出数组str的首地址。

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

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

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

     char arr[10];gets_s(arr,10);
         如果此时输入“hello ha”此时arr中存储的就是“hello ha”

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

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

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

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

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

      (3)字符输入和输入缓冲区的问题

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





未完待续,对不起

            











更多相关:

  • 学习目标:了解什么是数组;数组如何访问内存地址(一维,二维);什么是数组是由相同类型的元素的集合所组成的数据结构,分配一块连续的内存来存储。利用元素的索引可以计算出该元素对应的存储地址。 最简单的数据结构类型是一维数组。数组如何实现随机访问?数组是一种线性表数据结构,用一直连续的内存空间来储存一组具有相同类型的数据。根据数组的特性(连...

  • 一、静态数据及动态数组的创建     静态数据:               int a[10];             int a[]={1,2,3};             数组的长度必须为常量。     动态数组:             int len;             int *a=new int...

  • 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 示例 1: 给定 nums = [3,2,2,3], val...

  • 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums = [1,1,2],  函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2...

  • 文章目录1. 数组的声明2. 数组元素的遍历3. 数组的截取4. Go 语言的切片5. 数组 和 切片的共同点...

  • 一:常量和变量 开始之前,还是照例做个经典的例子,如下: declare mydate varchar2(16) := 'hellow world'; begindbms_output.put_line(mydate); end; declare是声明部分我在这个部分声明了varchar2类型的变量,名字叫mydata,内容是he...

  • 1. 三字母词 在C语言中有一种三字母词的说法,trigraph sequences,目前为止有九种三字母词,如下 ??=               #                  ??)            ]                  ??!           |         ??(      ...

  • 题目:   请你来实现一个 atoi 函数,使其能将字符串转换成整数。   首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。   当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组...

  • 联考考试考到了这个题,随机化40分,现在来秒掉它吧。   题意: 给一个字符串,求其中的一段,使得出现次数最多的字符与出现次数最少的字符的出现次数之差最大。 输入输出样例 输入样例#1: 复制 10 aabbaaabab 输出样例#1: 复制 3   我们定义$cnt[i][j]$表示区间$[1,i]$中,j出现的次数, 定义...

  • 本推文主要识别的验证码是这种:第一步: 二值化所谓二值化就是把不需要的信息通通去除,比如背景,干扰线,干扰像素等等,只剩下需要识别的文字,让图片变成2进制点阵。第二步: 文字分割为了能识别出字符,需要对要识别的文字图图片进行分割,把每个字符作为单独的一个图片看待。第三步: 标准化对于部分特殊的验证码,需要对分割后的图片进行标准化处理,...

  •   源字符串: a a 1 ~`!@#$%^&()_+-={}[];',.- + 编码后: a%20a%201%20~%60%21@%23$%25%5E&%28%29_+-=%7B%7D%5B%5D;%27,.-%20+   源字符串: 变 ~!@#¥%…………&()——+=-·{}:“;‘、《》?,。、-+A a 1 编码后:...