c语言学习 字符串数组 字符串函数 二维数组

一、字符串数组

1.字符串数组长度

char s[] = "hello"; 
s的长度 ---数组的长度 6 
char s[10] = "hello";
s的长度 ---数组的长度 10 

对于:h''e''l''l''o''\0' 
它的字符串长度 
     '\0' 前面字符个数
     "hello" 字符串长度 5个 
      它所占的内存空间的字节数是 6 个

// 字符数组的定义和使用
char arr1[5] = {'H', 'e', 'l', 'l', 'o'};  // 字符数组,不是字符串,没有null结尾
char arr2[6] = {'H', 'e', 'l', 'l', 'o', '\0'};  // 字符数组,以null结尾,是一个字符串
 
// 字符串的定义和使用
char str1[] = "Hello";  // 字符串,编译器自动添加null结尾
char str2[10];
strcpy(str2, "Hello");  // 使用strcpy函数将字符串复制给字符数组,确保以null结尾

2.puts

 int puts(const char *s);
功能:
            将一个以null结尾的字符串输出到标准输出(stdout),并自动添加一个换行符('\n')。

int i = 0;
while(s[i] != '\0')
{
    printf("%c",s[i]);
    ++i;
}
putchar('\n');

参数:
         s   //表示字符串 -- 指针类型 
             //字符数组名 s
             //字符串常量 "hello"
返回值:
          成功 非负数 
          失败 -1 
注意:
       puts输出时 自动会加 换行 

puts("Hello, world!");  // 输出字符串 "Hello, world!" 并自动换行
char s[] = "hello";
puts(s);//输出字符数组s

二.字符串函数

头文件:<string.h>

1.strlen

size_t strlen(const char *s);
 功能:  计算字符串长度 
 参数:
    s :表示需要一个指针
 可以给的参数形式
      a.数组名 
      b.字符串常量 
 返回值: 返回字符串长度

计算字符串长度:

char a[20];
int i;
i = 0;
while(a[i] != '\0')
{
	i++;
}

2.strcpy

char * strcpy(char *dest, const char *src);
功能:复制字符串,将src中字符串,复制到dest 
参数:
  src   表示原字符串 可以给的实参形式:a.一维字符数组名
          b.字符串常量           
  dest   表示目的字符串,可以给的实参形式:一维字符数组名

3.strcat

将2个数组拼接起来可以用以下代码

	char s1[20],s2[20];
	printf("输入第一句:");
	gets(s1);
	printf("输入第二句:");
	gets(s2);
 
    int i,j;
	i = 0;
	j = 0;
	while(s1[i] != '\0')
	{
		++i;
	}
 
	do
	{
		s1[i] = s2[j];
		++i;
	}while(s2[j++] != '\0');

为了更方便操作,我们接下来学习strcat数组拼接函数。

char *strcat(char *dest, const char *src);
   功能:拼接字符串 
   参数:
      dest  目的字符串 
            可以使用的实参形式
            一维字符型数组名 
      src   源字符串 
             可以使用的实参形式
            a.一维字符型数组名  
            b.字符串常量 
 用法:

 char dest[100];
 char src[100] = "world";
 strcat(dest,src);
 strcat(dest,"english");

4.字符串 比较规则 

字符串比较的规则与其他语言中的规则相同,
即对两个字符串自左至右逐个字符相比(按 ASCII 码值大小比较),
直到出现不同的字符或遇到'\0' 为止。
如全部字符相同,则认为相等;
若出现不相同的字符,则以第1个不相同的字符的比较结果为准。 

比较的结束的条件:
s1[i]!=s2[i] || s1[i]=='\0' || s2[i] == '\0'

只看,结束时,s1 最后一个字符 和 s2最后一个字符 之间的大小关系 

5.strcmp

int strcmp(const char *s1, const char *s2);
 功能: 比较字符串大小 
 参数:
  s1  //字符串 
  s2  //字符串 
  数组名 
  字符串常量    
返回值: //最后 停的位置上字符的差值 来反映大小。

strcmp的使用:

    int n;
	n = strcmp(s1,s2);
	if(n > 0)
	{
		printf("s1大\n");
	}else if(n < 0)
	{
		printf("s2大\n");
	}else
	{
		printf("相等\n");

不用strcmp数组比较函数,代码可以这样写:

	char s1[20],s2[20];
	gets(s1);
	gets(s2);
 
	int i = 0;
	for(i = 0;i < 20;++i)
	{
		if(s1[i] != s2[i] || s1[i] == '\0' || s2[i] == '\0')
		{
			break;
		}
	}
 
	if(s1[i] > s2[i])
	{
		printf("s1大\n");
	}else if(s1[i] < s2[i])
	{
		printf("s2大\n");
	}else
	{
		printf("相等\n");
	}

三、二维数组

1.二维数组


   二维数组:类型说明符 数组名[常量表达式][常量表达式]
                               (1)       (2)              (3)           (4)     
  说明 (1) 类型说明符 --- 用来说明数组中存储数据的类型 //
          (2) 数组名     --- 标识符 
          (3) 常量表达式 --- 行 --多少行
          (4) 常量表达式 --- 列 --多少列 

scanf输入:

	int a[3][3];
 
	int i,j;
	i = 0;
	j = 0;
 
	for(i = 0;i < 3;++i)
	{
		for(j = 0;j < 3;++j)
		{
			scanf("%d",&a[i][j]);
		}
	}

2.数组初始化:
 

  int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//全部初始化                 
  int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//全部初始化                
  int a[3][4] = {1,2,3,4,5,6};//部分初始化     
  int a[3][4] = {{1,2},{5,6},{9,10}};//全部初始化

3.二维数组的本质

注意:
    1.c语言中,并不存在真正的二维数组,都是用一维数组模拟的。
    2.二维数组的本质
      实际上 一维数组类型的一维数组,数组的数组        
    3.二维数组数据存储时,
      按行优先存储 

二维数组的理解:

4.练习 

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

置换为

1 5 9 13

2 6 10 14

3 7 11 15

4 8 12 16     即:4*4数组,以对角线为对称,对角线2边进行置换。

	int i,j;
	i = 0;
	j = 0;
	int n = 0;
	for(i = 0;i < 4;++i)
	{
		for(j = 0;j < 4;++j)
		{
			a[i][j] = ++n;
		}
	}
	
	int temp;
	for(i = 0;i < 4;++i)
	{
		for(j = i;j < 4;++j)
		{
			temp = a[i][j];
			a[i][j] = a[j][i];
			a[j][i] = temp;
		}
	}
 
	for(i = 0;i < 4;++i)
	{
		for(j = 0;j < 4;++j)
		{
			printf("%d ",a[i][j]);
		}
		putchar('\n');
	}

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值