第六章:数组

简介: 第六章:数组

6.1 引例

   输入某班10个学生某门课程成绩,计算并输出全班学生的平均成绩,同时统计并输出成绩低于平均分的人数。

#include<stdio.h>
#define N 10
int main()
{
  float score[N];
  float aver = 0;
  int i, n = 0;
  printf("Please enter the scores of %d students:\n", N);
  for (i = 1; i < N; i++)
  {
    scanf("%f", &score[i]);
    aver += score[i];
  }
  aver = aver / N;
  for (i = 0; i < N; i++)
    if (score[i] < aver)n++;
  printf("The average value is:%4.1f,Below average:%2d", aver, n);
  return 0;
}

运行结果

49f6ccb539764d74b3711433b6bc3c45.png

   说明:在程序中使用数组,可以让一批相同类型的变量使用同一个数组变量名,用下标来相互区分。这样表示的优点是程序简洁,可读性好,便于使用循环结构。

6.2 一维数组

   数组是相同数据类型的有序数据的集合。带有一个下标的称为一维数组,带有两个下标的称为二维数组,带有多个下标的称为多维数组,常用的式一维数组和二维数组。

6.2.1 一维数组的定义和引用

1、一维数组的定义


   一维数组定义的一般形式为

类型名  数组名[常量表达式];

说明:1、常量表达式表示数组元素的个数,即数组的长度。C语言规定,数组元素下标从0开始,不能为负数。而下标的最大值由“常量表达式”的值减1确定。


注意:常量表达式不能用圆括号也不能使用花括号。


特别注意:C语言不检查数组元素的下标是否越界。


2、常量表达式可以是整型常量或者符合常量,不能包含变量。也就是说,不允许用变量对数组的大小进行定义。


3、和普通变量一样,定义数组时系统为每个数组元素都要分配存储单元。同一数组在内存中占用一片连续的存储单元。


4、在定义语句中,可以有多给数组说明符,它们之间用逗号隔开。


2、一维数组元素的引用


   与简单的变量不同的是,不能整体引用一个数组,只能引用数组中的某个元素。也就是说,在参与表达式运算时,数组只能以数组元素的形式出现。数组元素引用形式为:

数组名[下标]
#include<stdio.h>
int main()
{
  int i, a[6];
  for (i = 0; i < 6;i++)
    a[i] = i * 2;
  for (i = 5; i >= 0; i--)
    printf("%3d", a[i]);
  return 0;
}

运行结果

ed6f665e15cc4138b271e72b331b657c.png

6.2.2 一维数组初始化

   和普通变量一样,可以在定义时,对数组元素进行赋值,称为数组的初始化。一维数组初始化的一般形式为:

类型名  数组名[数组长度] = {初值表};

说明:1、数组元素的初值依次写在一对花括号内,数据之间用逗号分隔。


2、静态存储的数组在定义时如果没有初始化,系统自动给所有的数组元素赋0。


3、动态存储的数组在定义时如果没有初始化,则与“未初始化的变量,其值是不确定的”一样,其元素的值是不确定的。


4、可以只对数组的前几个元素赋初值,其余元素的初值为0。


注意:如果只给部分元素赋初值时,由于数组的长度与提供初值的个数不相同,数组长度不能省略。如果省略系统会认为部分元素为全部元素。


5、如果一个数组中全部的值均为0,可简写成:int a[6]=0;


6、若初值个数大于数组长度,会产生编译错误。


7、初值表中只能为常量,不能是变量,即使已赋值的变量也不行。


输出不同类型存储类型数组的初值示例。

#include<stdio.h>
int main()
{
  static int a[10];
  int b[10], i;
  for (i = 0; i < 10; i++)
    printf("%5d", a[i]);
     printf("\n");
  for (i = 0; i < 10; i++)
    printf("%5d", b[i]);
  return 0;
}

运行结果5ba887eb3b6d4b83b4b6a6a4159b5e27.png

6.2.3 一维数组程序设计示例

   编写程序,输入一个正整数n(1<n<=10),再输入n个整数,将这n个整数逆序存放并输出。

#include<stdio.h>
int main()
{
  int n, i, a[10], t; 
  printf("Input variable n value:");
  scanf("%d", &n);
  printf("Enter %d integers:", n);
  for (i = 0; i < n; i++)
    scanf("%d", &a[i]);
  for (i = 0; i < n / 2; i++)
  {
    t = a[i];
    a[i] = a[n - 1 - i];
    a[n - 1 - i] = t;
  }
  printf("Reverse storage:");
  for (i = 0; i < n; i++)
    printf("%3d", a[i]);
  printf("\n");
  return 0;
}

运行结果

ebfb882370684881a639da48083e3964.png

   递推法示例。输出斐波拉契数列的前20项。

#include<stdio.h>
int main()
{
  int f[21], i;
  f[1] = 1;
  f[2] = 1;
  for (i = 3; i < 21; i++)
    f[i] = f[i - 1] + f[i - 2];
  for (i = 1; i < 21; i++)
  {
    printf("%-8d", f[i]);
    if (i % 4 == 0)
      printf("\n");
  }
  return 0;
}

运行结果

b2566c713ad141689f9278f345ec3381.png

    选择法排序。从键盘输入10个数,要求按升序排序,输出排序结果。

#include<stdio.h>
int main()
{
  int i, j, t, a[10];
  printf("Please enter 10 integers:");
  for (j = 0; j < 10; j++)
    scanf("%d", &a[j]);
  printf("\n");
  for(i=0;i<9;i++)
    for(j=i+1;j<10;j++)
      if(a[i]>a[j])
      {
        t = a[i]; a[i] = a[j]; a[j] = t;
      }
  printf("After sorting:\n");
  for (j = 0; j < 10; j++)
    printf("%4d", a[j]);
  return 0;
}

运行结果

4d379d46915d40489c63cc665e39a53b.png

   直接排序法。从键盘输入10个数,用直接法升序排序

#include<stdio.h>
int main()
{
  int i, j, t, a[10], k;
  printf("Please enter 10 integers:");
  for (j = 0; j < 10; j++)
    scanf("%d", &a[j]);
  printf("\n");
  for (i = 0; i < 9; i++)
  {
    k = i;
    for (j = i + 1; j < 10; j++)
      if (a[k] > a[j])
        k = j;
    if (i != k)
    {
      t = a[k]; a[k] = a[i]; a[i] = t;
    }
  }
  printf("After sorting:\n");
  for (j = 0; j < 10; j++)
    printf("%4d", a[j]);
  return 0;
}

运行结果

be90a86d8a4141bab4d305229780daaf.png

    利用冒泡排序法,对输入的数据按升序排序。

#include<stdio.h>
#define N 6
int main()
{
  int i, j, t, a[N];
  printf("Please enter %d integers:\n", N);
  for (i = 0; i < N; i++)
    scanf("%d", &a[i]);
  printf("\n");
  for(i=0;i<N;i++)
    for(j=0;j<N-i-1;j++)
      if (a[j] > a[j + 1])
      {
        t = a[j]; a[j] = a[j + 1], a[j + 1] = t;
      }
  printf("After sorting:\n");
  for (i = 0; i < N; i++)
    printf("%3d", a[i]);
  return 0;
}

运行结果

499d02c3a9da44fdb1bc02b60ed17b6a.png

   假设已有5个整数按升序存放在数组a中,要求编程实现从键盘输入一个任意的整数n,将它存放到数组a中,使数组中的6个整数仍按升序存放。

#include<stdio.h>
int main()
{
  int a[6] = { 1,3,5,7,9 }, i, n;
  printf("Array before insertion:");
  for (i = 0; i < 5; i++)
    printf("%3d", a[i]);
  printf("\nPlease enter the number of to insert:");
  scanf("%d", &n);
  for (i = 4; i >= 0; i--)
    if (a[i] < n)
    {
      a[i + 1] = n;
      break;
    }
    else
      a[i + 1] = a[i];
  if (i < 0)
    a[0] = n;
  printf("Insert later array:");
  for (i = 0; i < 6; i++)
    printf("%5d", a[i]);
  printf("\n");
  return 0;
}

运行结果

76750315c2ec4b039a8cd28e4234a4a9.png

   利用顺序查找,在给定的数据中查找一个数据是否存在。若存在,输出元素的下标,否则输出不存在的信息。

#include<stdio.h>
#define N 10
int main()
{
  int a[N], i, x;
  printf("Enter %d integers:", N);
  for (i = 0; i <= N - 1; i++)
    scanf("%d", &a[i]);
  printf("Enter the number x to find:");
  scanf("%d", &x);
  for (i = 0; i <= N - 1 && a[i] != x; i++);
  if (i >= N)
    printf("not found\n");
  else
    printf("Eureka,is %d numbers\n", i + 1);
  return 0;
}

运行结果

ac8d0cd53f224cf4abc905a1d926636a.png

   任意输入一个数,在已经升序排好的一组数据中按折半查找算法找到这个数所在的位置。

#include<stdio.h>
int main()
{
  int a[12] = { 3,5,8,9,14,17,19,21,23,26,28,32 };
  int x, i, top, bot, mid, find;
  printf("Please enter the number to find:");
  scanf("%d", &x);
  top = 0;
  bot = 11;
  find = 0;
  do
  {
    mid = (top + bot) / 2;
    if (x == a[mid])
    {
      printf("found:%d,it is a[%d].\n", x, mid);
      find = 1;
      break;
    }
    else if (x < a[mid])
      bot = mid - 1;
    else
      top = mid + 1;
  } while (top <= bot);
  if (!find)
    printf("%d not found.\n", x);
  return 0;
}

运行结果

0468f00061994bfaab48d83ea839d759.png

6.3 二维数组

   程序中存储一个班10名学生的某一门课程的成绩使用了一维数组,现在要存储一个班10名学生的6门课程的成绩则需要使用二维数组。

6.3.1 二维数组的定义和引用

1、二维数组的定义


二维数组的一般形式为:

类型名  数组名[常量表达式1][常量表达式2];

   与一维数组相比,二维数组的定义除了增加一个常量表达式外,其他都一样。常量表达式1表示数组第一维的长度(行数),常量表达式2表示数组第二维的长度(列数),相当于数学中的一个矩阵。使用二维数组时也有注意数组元素下标越界。


说明:1、表示行数和列数的常量表达式必须在两个中括号内。


2、二维数组(包含更多维数组)在内存中是按行存放。


3、对多维数组可以看成是其元素也是数组的数组。


 逐步分解,降低维数的方法对于理解多维数组的存储方式、初始化及指针有很大的帮助。


2、二维数组的引用


   和一维数组一样,二维数组被引用的也是它的元素,而不是它的名称(名称表示二维数组第一个元素的首地址)。二维数组元素的引用形式为:

数组名[行下标][列下标]

输入一个二维数组值,并将其在数组中的内容及地址显示出来。

#include<stdio.h>
int main()
{
  int a[2][3];
  int i;
  for (i = 0; i < 2; i++)
  {
    printf("input a[%d][0],a[%d][1],a[%d][2]\n", i, i, i);
    scanf("%d,%d,%d", &a[i][0], &a[i][1], &a[i][2]);
  }
  for (i = 0; i < 2; i++)
  {
    printf("a[%d][0]=%d,addr=%x\n", i, a[i][0], &a[i][0]);
    printf("a[%d][1]=%d,addr=%x\n", i, a[i][1], &a[i][1]);
    printf("a[%d][2]=%d,addr=%x\n", i, a[i][2], &a[i][2]);
  }
  return 0;
}

运行结果

dff025ad8b7a4e0c8c0c97a1adfb30f6.png

上述地址在不同的系统中有所不同。

6.3.2 二维数组的初始化

   二维数组的初始化要特别注意各个常量的排列顺序,这个排列顺序与数组的各元素在内存中存储顺序完全一致。二维数组初始化的一般形式为:

类型名  数组名[行数][列数]={初值表};

1、按行给二维数组赋初值。


逐行赋初值,简单明了,容易检查,也不容易遗漏。


2、可以将所有数据放置在一个大括号内,按数组元素排列的顺序赋初值。


数据太多时,不易检查,容易遗漏。


3、可以对二维数组的部分元素赋初值。


4、在定义数组时,行数可以省略,但列数不能省略。


   初始化二维数组,然后输出该数组。

#include<stdio.h>
int main()
{
  int i, j, a[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
  for (i = 0; i <= 2; i++)
  {
    for (j = 0; j <= 2; j++)
      printf("%3d", a[i][j]);
    printf("\n");
  }
  return 0;
}

运行结果

4922b812c5294435b5ef362523685b18.png

6.3.3 二维数组程序设计示例

   编写程序,求出3×4的矩阵中最大元素的值及其所在的行号和列号。

#include<stdio.h>
int main()
{
  int i, j, row = 0, colum = 0, max;
  int a[][4] = { {11,9,33,4},{23,42,53,7},{15,6,37,8} };
  printf("array:\n");
  for (i = 0; i <= 2; i++)
  {
    for (j = 0; j <= 3; j++)
      printf("%-4d", a[i][j]);
    printf("\n");
  }
  max = a[0][0];
  row = 0; colum = 0;
  for (i = 0; i <= 2; i++)
    for (j = 0; j <= 3; j++)
      if (a[i][j] > max)
      {
        max = a[i][j];
        row = i;
        colum = j;
      }
  printf("Maximum element is: %d ,Line number: %d ,Column number: %d\n", max, row, colum);
  return 0;
}

运行结果

a32e0e310757403db4d734532e1d7ff2.png

    编程计算3×3的矩阵的两条对角线上所有元素之和。

#include<stdio.h>
int main()
{
  int a[3][3] = { 9,4,7,5,6,1,8,3,2 }, sum = 0, i, j;
  printf("Array:\n");
  for (i = 0; i < 3;i++)
  {
    for (j = 0; j < 3; j++)
      printf("%3d", a[i][j]);
    printf("\n");
  }
  for (i = 0; i < 3; i++)
    for (j = 0; j < 3; j++)
      if (i == j || i + j == 2)
        sum = sum + a[i][j];
  printf("Sum of diagonal elements:%d\n", sum);
  return 0;
}

运行结果

4e64eb521af34f4e990360ab3303e8b5.png

    输出杨辉三角形。

#include<stdio.h>
#define N 11
int main()
{
  int i, j, y[N][N];
  for (i = 1; i < N; i++)
  {
    y[i][1] = y[i][i] = 1;
    for (j = 2; j <= i - 1; j++)
      y[i][j] = y[i - 1][j] + y[ i - 1 ][j - 1];
  }
  for (i = 1; i < N; i++)
  {
    for (j = 1; j <= i; j++)
      printf("%4d", y[i][j]);
    printf("\n");
  }
  return 0;
}

运行结果

630c030b28ed44579e69cea8b75c3fac.png

    编写程序,求3×4的矩阵a的转置矩阵。

#include<stdio.h>
int main()
{
  int a[3][4] = { 2,5,7,9,6,14,20,8,15,0,12,3 }, b[4][3], i, j;
  printf("Array a:\n");
  for (i = 0; i < 3; i++)
  {
    for (j = 0; j < 4; j++)
      printf("%-4d", a[i][j]);
    printf("\n");
  }
  for (i = 0; i < 4; i++)
    for (j = 0; j < 3; j++)
      b[i][j] = a[j][i];
  printf("Array b:\n");
  for (i = 0; i < 4; i++)
  {
    for (j = 0; j < 3; j++)
      printf("%-4d", b[i][j]);
    printf("\n");
  }
  return 0;
}

运行结果

bce363510b2043c5b22801afcf9d55fd.png

    输入一个日期,判断该日期是当年的第几天。

#include<stdio.h>
int main()
{
  int year, month, day, i, leap;
  int tab[2][13] = { {0,31,28,31,30,31,30,31,31,30,31,30,31},
                   {0,31,29,31,30,31,30,31,31,30,31,30,31} };
  printf("Please enter year-month-day:");
  scanf("%d-%d-%d", &year, &month, &day);
  leap = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
  for (i = 1; i < month; i++)
    day = day + tab[leap][i];
  printf("It was back then %d day\n", day);
  return 0;
}

运行结果

fe353a38dbc84704a709b71301d571ca.png

6.4 字符数组

     与整型数组的数组元素是一个整数、实型数组的数组元素是一个实数一样,字符数组的数组元素是一个字符。

6.4.1 字符数组的定义和引用

   字符数组也分为一维数组和二维数组。


   (1)一维字符数组的一般形式为:

char 数组名[常量表达式]

   (2)二维字符数组的一般形式为

char 数组名[常量表达式1][常量表达式2]

   (3) 字符数组的引用也是引用字符数组元素,其方法与其他数组完全相同。

6.4.2 字符数组的初始化

   字符数组的初始化方法与其他数组的初始化方法类似。初始化的一般形式为:

char 数组名[常量表达式]={初值表};

说明:1、若初值表中初值的个数大于字符数组的长度,则编译错误。


2、若初值表中初值的个数小于字符数组的长度,多于元素的初值为0。


3、若初值表中初值的个数等于字符数组的长度,可以在定义时,省略数组的长度,编译系统根据初值的个数确定数组的长度。


4、允许用字符串常量对字符数组进行初始化。


5、若字符数组在定义时未进行初始化,则各元素的初值不确定,这一点跟整型数组规定相同。


6、二维字符数组的初始化方法与一维字符数组的初始化方法类似。


注意:字符‘\0’代表整数0,也就是ASCII码为0的字符。但‘\0’不是字符‘0’,字符‘0’的ASCII码值为48.

6.4.3 字符数组程序设计示例

   由键盘输入一行字符,统计其中小写字母的个数,并将所有的小写字母转换成大写字母后输出这个字符串。

#include<stdio.h>
int main()
{
  int i, n = 0;
  char s[20];
  printf("Please enter a string:");
  for (i = 0; (s[i] = getchar()) != '\n'; i++)
    if (s[i] >= 'a' && s[i] <= 'z')
      n++;
  printf("n=%d\n", n);
  for (i = 0; s[i] != '\n'; i++)
    if (s[i] >= 'a' && s[i] <= 'z')
      printf("%c", s[i] - 32);
    else
      printf("%c", s[i]);
  printf("\n");
  return 0;
}

运行结果

680ac1015916452dbf47665a93731089.png

6.5 字符串

   字符串常量是用双引号括起来的字符序列,它有一个结束标志‘\0’。在C语言中有字符串常量,但没有字符串变量这个概念,字符串是通过字符数组来存储和处理的。

6.5.1 字符串的存储

   注意字符数组与字符串的区别:字符串是用字符数组存储的,但字符数组不一定就是字符串。由于字符串一定要有一个结束标志'\0',所以存储字符串数组长度至少是字符串的有效长度+1.

6.5.2 字符串的输入与输出

   1、逐个字符的输入输出


(1)利用标准输入输出函数scanf()和printf(),配合%c格式描述符。


使用scanf()和printf()函数输入输出字符串示例。

#include<stdio.h>
int main()
{
  int i;
  char str[11];
  printf("Please enter 10 characters:");
  for (i = 0; i < 10; i++)
    scanf("%c", &str[i]);
  str[i] = '\0';
  i = 0;
  while (str[i] != '\0')
  {
    printf("%c", str[i]);
    i++;
  }
  return 0;
}

运行结果

0f18cd3867734cad8670544e4dc30fe8.png

(2)使用getchar()和putchar()函数输入输出字符串。

#include<stdio.h>
int main()
{
  int i = 0;
  char str[80];
  printf("Please enter a string of characters:");
  while ((str[i] = getchar()) != '\n')
    i++;
  str[i] = '\0';
  for (i = 0; str[i] != '\0'; i++)
    printf("%c", str[i]);
  return 0;
}

运行结果

bb4389d36d6d4826bbc314c7e580b758.png

    2、字符串的整体输入


(1)利用标准输入函数scanf(),配合%s格式描述符。


调用格式为:


scanf("%s",字符数组名);

   在使用%s格式控制输入字符串时,scanf()函数会自动在字符串后面加上‘\0’。


   由于数组名代表数组的起始地址,因此在scanf()函数的字符数组名str前面不用加&。


   使用函数scanf(),配合%s格式描述符整体输入字符串示例。

#include<stdio.h>
int main()
{
  char str[10];
  printf("Please enter a string of characters:");
  scanf("%s", str);
  printf("%s\n", str);
  return 0;
}

运行结果

06a39bd01e134b8a88ea250bdf37033b.png

(2)如果需要输入中间含有空格的字符串时,则要用具有多个输入参数的scanf()函数配合输入。


   不能使用scanf()函数输入一个包含多个单词和空格的句子给一个字符数组。


(3)使用gets()输入完整的字符串。


调用格式为:

gets(字符数组名);

使用该函数可以将键盘输入的一行字符以字符串的形式存放到一个字符数组中。输入一行字符时以Enter键作为结束符,且自动将回车符‘\n’转换为‘\0’,作为字符串结束标志。


   注意:用gets()函数一次只能输入一个字符串,gets()函数能输入完整的句子,弥补了scanf()函数不能输入包含空格的字符串的不足。


  3、字符串的输出


(1)利用标准输出函数printf(),配合%s格式描述符。


调用格式:

printf(“%s”,字符数组名);

   调用printf()函数输出字符串时要使用格式控制符%s,%s对应的输出项是要输出的字符串中的第1个字符的地址。


  (2)使用函数puts()输出完整的字符串。


调用格式为:

puts(字符数组名);

使用该函数可以将一个字符串(以‘\0’结束的字符序列)输出到屏幕,输出后会自动换行。


4、几个输入输出字符串的函数的比较

函数 格式 区别
scanf() scanf(“%s”,字符数组名) 不能输入带有空格的字符串,使用多个格式控制符%s可以输入多个字符串,遇空格结束输入,需要人为加上字符串结束标志‘\0’
gets() gets(字符数组名) 只能输入一个字符串,遇见回车符结束输入,且自动将回车符‘\n’转换为'\0'
printf() printf("%s",字符数组名) 一个printf()函数可以出多个字符串,输出后不会自动换行
puts() puts(字符数组名) 一个puts()函数只能输出一个字符串,输出后会自动换行

6.5.3 字符串处理函数

   C语言中没哟对字符串进行赋值、合并和比较的运算符,但提供了一些用于处理字符串的标准函数。用户可调用这些函数来进行各种操作。需在开头包含预处理头文件:


#include<string.h>

1、字符串复制函数strcpy()


函数strcpy()的一般调用格式为:

strcpy(字符串1,字符串2)

功能:将字符串2复制到字符串1。


注意:


1、参数字符串2可以是字符数组名,也可以是字符串常量。但参数字符串1必须是字符数组名。


2、字符串1必须有足够的空间来容纳字符串2。


3、复制时直接遇到字符串2中的‘\0’为止(包含‘\0’)。


strcpy函数应用示例。

#include<stdio.h>
#include<string.h>
int main()
{
  char c1[] = "123456789";
  strcpy(c1 + 4, "hello");
  puts(c1);
  return 0;
}

运行结果

5795ac3d68e94d56b31f1473309d04a0.png


4、若将字符串2的前n个字符复制到字符串1中,可以使用strncpy()函数。


调用格式:

strncpy(字符串1,字符串2,n)

strncpy函数部分复制应用示例。

#include<stdio.h>
#include<string.h>
int main()
{
  char str1[10] = "abcdef", str2[] = "ABCDEF";
  strncpy(str1, str2, 4);
  puts(str1);
  return 0;
}

运行结果

057b28b442824d299000644fa0baa079.png

部分复制字符串时,只在目标字符串中国替换指定长度的内容。


2、字符串连接函数strcat()


函数strcat()的一般调用格式为:

strcat(字符串1,字符串2)

功能:连接两个字符串。


注意:


1、参数字符串2可以是字符数组名,也可以是字符串常量。到参数字符串1必须是字符数组名。


2、字符数组1必须有足够的的空间,以便能容纳字符串2。


3、连接时用字符串2的首字符覆盖字符串1的结束标志‘\0’,系统在新字符串的末尾添加一个字符串的结束标志‘\0’。


strcat()函数应用示例。

#include<stdio.h>
#include<string.h>
int main()
{
  char c1[20] = "hello,";
  strcat(c1, "how are you!");
  puts(c1);
  return 0;
}

运行结果

d6a414482f0d4ac69eef2e4097fddbea.png

3、字符串比较函数strcmp()


函数strcmp()的一般调用格式为:

strcmp(字符串1,字符串2)

功能:比较两个字符串的大小。


函数的返回值为一个整数,即:


1、当字符串1<字符串2时,返回值<0.


2、当字符串1=字符串2时,返回值=0.


3、当字符串1>字符串2时,返回值>0.


   字符串的比较规则是:从两个字符串的首字符开始,依次比较对应字符ASCII码,直到出现不同字符或‘\0’为止。如果所有字符都相同,返回0;否则,以第一个不相同字符比较结果为准,返回这两个字符的差。


strcmp()函数应用示例。

#include<stdio.h>
#include<string.h>
int main()
{
  char c1[] = "12345", c2[] = "12345";
  printf("%d\n", strcmp(c1, c2));
  printf("%d\n", strcmp("zhang", "zhao"));
  printf("%d\n", strcmp("zhou", "zhang"));
  return 0;
}

运行结果

2c70a0c3e02247f1b51771561d955dc5.png

4、求字符串长度函数strlen()


函数strlen()的一般调用格式为:

strlen(字符串)

功能:计算字符串长度,不包含结束标志‘\0’。

#include<stdio.h>
#include<string.h>
int main()
{
  char c1[] = "123456";
  printf("%d,%d\n", strlen(c1), sizeof(c1));
  return 0;
}

运行结果

3e26781d3a7746a1aab9f22fb33fbea7.png

注意strlen()函数与sizeof()函数的区别。


5、大写字母转小写字母函数strlwr()


函数strlwr()的一般调用格式为:

strlwr(字符串)

功能:将大写字符转换为小写字母。


strlwr()函数应用示例。

#include<stdio.h>
#include<string.h>
int main()
{
  char c1[] = "AbBbCcDd";
  printf("%s\n", c1);
  printf("%s\n", _strlwr(c1));
  return 0;
}

运行结果

76c2b2678aa649bfb84d602b15bf415f.png

6、小写字母转大写字母函数strupr()


函数strupr()的一般调用格式为:


strupr(字符串)

功能,将小写字母转换为大写字母。


strupr()函数应用示例。

#include<stdio.h>
#include<string.h>
int main()
{
  char c1[] = "AaBbCcDd";
  printf("%s", c1);
  printf("\n%s", _strupr(c1));
  return 0;
}

运行结果

99199472069e46098ea752f23597b8e4.png

6.5.4 字符串程序设计示例

   由于每个字符串都有一个结束标识符‘\0’,所以在处理字符串时,字符串的长度对于循环程序的控制不是很重要了,一般在循环语句中不使用字符串长度进行循环控制,可以用字符串结束标志符‘\0’来控制循环次数。


   要求不使用字符串处理函数,计算字符串的长度,即统计字符数组中每一个‘\0’前面的字符个数,并输出该字符串。

#include<stdio.h>
int main()
{
  int i, length;
  char ch[80] = "China";
  for (i = 0; ch[i] != '\0'; i++)
    ;
  length = i;
  printf("String length is:%d\n", length);
  puts(ch);
  return 0;
}

运行结果

249e867d950745c894263cab8fc2a216.png

    编写程序,删除一个字符串中某个字符。

#include<stdio.h>
#include<string.h>
int main()
{
  int i, j = 0;
  char ch[] = "this is a string.", c;
  puts(ch);
  printf("Please enter a character:");
  c = getchar();
  for (i = 0; ch[i] != '\0'; i++)
    if (ch[i] != c)
      ch[j++] = ch[i];
  ch[j] = '\0';
  printf("%s\n", ch);
  return 0;
}

运行结果

1ee0e561b91145938041625a59fa28a0.png

    编写程序,输入一个以回车符结束的字符串(少于80个字符),再输入一个字符,统计并输出该字符在字符串中出现的次数。

#include<stdio.h>
int main()
{
  int i = 0, count;
  char str[80], ch;
  printf("Please enter a string of characters:");
  while ((str[i] = getchar()) != '\n')
    i++;
  str[i] = '\0';
  printf("Enter a character:");
  ch = getchar();
  for (count = 0, i = 0; str[i] != '\0'; i++)
    if (str[i] == ch)count++;
  printf("Character %c appear %d frequency\n", ch, count);
  for (i = 0; str[i] != '\0'; i++)
    putchar(str[i]);
  printf("\n");
  return 0;
}

运行结果

c0a2d5aa917c40a597b317c440c44e0b.png

    输入一个字符串,判断是否为回文串。所谓回文串,是指一个字符串顺读还是反读是一样的。

#include<stdio.h>
#include<string.h>
int main()
{
  char s[10];
  int i, j, n;
  printf("Please enter a string of characters:");
  gets(s);
  n = strlen(s);
  for (i = 0, j = n - 1; i < j; i++, j--)
    if (s[i] != s[j])
      break;
      if (i < j)
        printf("Not a palindrome string\n");
      else
        printf("Is a palindrome string\n");
  return 0;
}

运行结果

a148c325562a422ea2cf30f8ded43099.png

   编写程序,实现两个字符串的连接。

#include<stdio.h>
#include<string.h>
int main()
{
  int i, n;
  char s1[20], s2[10];
  printf("Please enter the first string:");
  gets(s1);
  printf("Please enter the second string:");
  gets(s2);
  n = strlen(s1);
  for (i = 0; s2[i] != '\0'; i++)
    s1[n + i] = s2[i];
  s1[n + i] = '\0';
  printf("After connecting two strings:");
  puts(s1);
  return 0;
}

运行结果

8e32270d5c0f4c98ad500975d0d7a6ae.png

目录
相关文章
|
7月前
|
存储 C语言
谭浩强 第六章利用数组处理批量数据
谭浩强 第六章利用数组处理批量数据
78 0
|
6月前
|
存储 算法 C语言
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
二分查找算法的概念、原理、效率以及使用C语言循环和数组的简单实现
|
C语言
C数组超细节精髓
C数组超细节精髓
85 0
|
7月前
|
算法 Java 程序员
Java数组全套深入探究——进阶知识阶段4、一维数组练习题
Java数组全套深入探究——进阶知识阶段4、一维数组练习题
65 0
Java数组全套深入探究——进阶知识阶段4、一维数组练习题
|
7月前
|
存储 C语言
C语言从入门到实战——数组和指针的强化练习题
C语言中指针和数组有着密切的关系,因为数组名在C语言中可以看作是一个指针常量。 指针是一个变量,存储的是另一个变量的地址。可以通过指针来访问另一个变量的值。指针变量可以存储任何类型的地址,包括数组的地址。 数组是一组相同类型的数据元素的集合。在C语言中,可以用数组名来表示整个数组,在这个意义上,数组名看起来像一个指针变量。实际上,数组名在C语言中可以看作是一个指向数组首元素的指针常量。
72 0
|
7月前
|
存储 编译器 C++
第四章:C++中的数组
第四章:C++中的数组
41 1
|
7月前
|
存储 传感器 机器学习/深度学习
Java数组全套深入探究——进阶知识阶段6、三维数组以及更多维度数组的概念和用法
Java数组全套深入探究——进阶知识阶段6、三维数组以及更多维度数组的概念和用法
135 0
|
7月前
|
Java 数据处理 计算机视觉
Java数组全套深入探究——进阶知识阶段5、二维数组
Java数组全套深入探究——进阶知识阶段5、二维数组
77 0
|
7月前
|
算法 Java 程序员
Java数组全套深入探究——基础知识阶段4、数组的遍历
Java数组全套深入探究——基础知识阶段4、数组的遍历
73 0
|
7月前
|
存储 Java 程序员
Java数组全套深入探究——基础知识阶段1、数组的概述
Java数组全套深入探究——基础知识阶段1、数组的概述
60 0