C语言-字符和字符串专题-输入输出、字符(串)数组和字符(串)函数和字符指针-学习笔记07

文章目录

  • 1. 字符串输入与输出
    • 1.1 字符串的输入函数(gets)
    • 1.2 字符串的输出函数(puts)
  • 2. 字符数组
  • 3. 字符串数组
  • 4. 常用字符串函数
    • 4.1 求字符串长度(strlen)
    • 4.2 字符串拷贝(strcpy)
    • 4.3 字符串连接(strcat)
    • 4.4 字符串比较(strcmp)
    • 4.5 字符串与字符函数的扩展用法
  • 5. 字符(串)指针
    • 5.1 基本用法
    • 5.2 字符串常量
    • 5.3 字符串数组指针

1. 字符串输入与输出

1.1 字符串的输入函数(gets)

  • char * gets(char *s)
  • 字符串的最后个字符是\0,要注意数据长度
  • gets函数不会让空格成为字符串的结束标志,而scanf会,scanf需要 %c配合才能正常输入
    char s[5]; \\只能存四个字符,因为最后个字符是 \0
    gets(s)
    pritnf("%s\n", s);
    

1.2 字符串的输出函数(puts)

  • puts(string);
  • puts()printf()不一样的是puts()会自动换行不需要\n

2. 字符数组

  • 用法:char c[10], ch[3][4];
  • 字符数组的初始化:首先我们需要知道{'a', 'b', 'c', '\0'}=="abc"
    • 逐个字符赋值:
    	char ch[5]={'h', 'e', 'l', 'l', 'o';} //完整赋值
    	char ch[5]={'b', 'o', 'y'}; //部分赋值,那ch[3], ch[4]都是\0,NULL
    
    字符串 b o y \0 \0
    ASCII 98 111 121 0 0
    • 用字符串常量:
    //三种方法都可以
    char ch[]="HELLO";
    char ch[6]="HELLO";
    char ch[6]={"HELLO"};
    
    • 注意:在打印字符数组的时候我们可以将其当做字符串来打印,但是我们需要注意的是这个字符数组的最后一位得是\0。否则,会随着地址一直往下打印直到找到\0

3. 字符串数组

  • C语言中无字符串变量,而是用字符数组并以\0结尾当做字符串。
  • 举个例子:在内存中占6个字节,字符串长度5
字符串 h e l l o \0
ASCII 104 101 108 108 111 0
  • 举个二维数组的例子
    char fruit[][7]={"apple", "orange", "grape"};
    
水果 0 1 1 2 3 4 5 6
fruit[0] a p p l e \0 \0 \0
fruit[1] o r a n g e \0 \0
fruit[2] g r a p e \0 \0 \0
  • 例子:输入一个字符串,然后逆序输出
    #include 
    
    ...
    
    char arr[20];
    int i, n;
    printf("Please input a string: ");
    gets(arr);
    n= strlen(arr)
    for (i=n; i>=0; i--)
    	putchar(arr[i]);
    putchar('\n');
    

4. 常用字符串函数

  • 首先我们要先引入# include

4.1 求字符串长度(strlen)

  • 用法:strlen(字符数组),我们可以通过man strlen查询细节
  • 求字符串长度,且\0不包括在内。
  • \xhh:表示十六进制数代表的符号,举个例子在字符串中char s[]="\x69\141" → \rightarrow ia
  • \ddd:表示8进制
  • 练习:对于以下字符串,strlen(s)的值为:
    char s[10] = {'A', '\0', 'B', 'C', '\0', 'D'}; 
    printf("strlen: %ld, sizeof: %ld\n", strlen(s), sizeof(s)/sizeof(char)); //strlen: 1, sizeof: 10
    char s[]="\t\v\\\0will\n"; //长度为3
    char s[]="\x69\141\n"; //长度为3
    

4.2 字符串拷贝(strcpy)

  • 用法:strcpy(目标字符串, 需拷贝的字符串)

  • 返回:目标字符串的首地址

  • 要求:目标字符串的长度需 ≥ \ge 需拷贝的字符串长度

  • 注意:

    • 硬拷贝
    • 拷贝时,\0会一起拷贝
  • 例子

    char src[]="strcpy", dest[10];
    strcpy(dest, src);
    puts(src); //strcpy
    puts(dest); //strcpy
    dest[0] = 'a';
    puts(src); //strcpy
    puts(dest); //atrcpy
    

4.3 字符串连接(strcat)

  • 用法:strcat(string1, string2)
  • string2连在string1的后面
  • 返回string1的首字母
  • 要求:
    • string1需要足够大能放的下string2
    • 需要取消string1\0,连接string2,保留string2\0
  • 举个例子
    char dest[10] = "abcas", src[] = "123";
    strcat(dest, src);
    puts(dest);
    

4.4 字符串比较(strcmp)

  • 用法:strcmp(string1, string2)
  • 作用: 比较两个字符串
  • 比较的方法:从左往右逐字比较,直到遇到不同字符或\0(如果string1先遇到\0,则string2大。因为\0的ASCII值是0)
  • 返回:int整型
    • string1<string2:返回负整数-1
    • string1>string2:返回正整数1
    • string1==string2:返回0

4.5 字符串与字符函数的扩展用法

函数类型 函数 用法
字符串 strncpy(p, p1, n) p1拷贝给p,并指定复制的长度
strncat(p, p1, n) p1连在p的后面,并指定连的长度
strncmp(p, p1, n) 比较指定长度字符串
strcasecmp(p, p1) 忽略大小写比较字符串
strchr(string, ch) 在字符串中查找指定字符,返回第一个在该字符串中出现的地址,没找到返回空
找出一个字符在字符串中的位置strchr(s1, ch)-s1
strrchr(string, ch) 在字符串中查找指定字符,返回最后一个在该字符串中出现的地址,没找到返回空
strstr(p, p1) 查找字符串
memset(void *s, int c, size_t n) The memset() func fills the first n bytes of the memory area pointed to by s with the constant byte c
字符函数 isalpha(ch) 检查是否为字母字符(不是字符串,是单个字符 )
isupper(ch) 检查是否为大写字母字符
islower(ch) 检查是否为小写字母字符
isdigit(ch) 检查该字符是否为数字
toupper(ch) 变大写
tolower(ch) 变小写

5. 字符(串)指针

5.1 基本用法

  • C语言通过使用字符数组来处理字符串
  • 用法:char str[] = "string"; char *p = str;
  • 初始化字符指针是把内存中字符串的首地址赋予指针,并不是把该字符串复制到指针中
#include 
#include 

int main(int argc, char *argv[])
{
	char ch1[] = "Hello world!";
	char ch2[] = "Hello world!";
	char *p;

	p = ch1;
	if (isalpha(*p) && isupper(*p)){
		*p = tolower(*p);
	}
	printf("%s\n", p);

	p = ch2;
	printf("%s\n", p);
	return 0;
}

5.2 字符串常量

  • 当一个字符指针指向一个字符串常量时,不能修改指针指向的对象的值。举个例子简单说一下
char *p = "Hello World"; //字符指针指向字符串常量
*p = 'h'; //错误,字符串常量不能被修改 Segmentation fault (core dumped)
  • 字符串常量和static一样,都是放到一个固定的地址静态存储区,是不可能通过指针来修改字符串的
  • 例1:字符串常量存放到固定的地址
#include 

int main(int argc, char *argv[])
{
	char *p1 = "hello world!";
	char *p2 = "hello world!";
	printf("&p1=%p %p %s\n", &p1, p1, p1);
	printf("&p2=%p %p %s\n", &p2, p2, p2);
	return 0;
}

返回的两个地址都是一样的,也就是说虽然他们是不同的两个指针,但是因为都是指向同一个字符串常量,所以指向的地址一样

&p1=0x7ffe0371d618 0x55ae78ebf004 hello world!
&p2=0x7ffe0371d620 0x55ae78ebf004 hello world!

用个图会更加便于理解

helloWorld
地址:0x55ae78ebf004
p1
p1 = 0x55ae78ebf004
&p1 = 0x7ffe0371d618
p2
p2 = 0x55ae78ebf004
&p2 = 0x7ffe0371d620
  • 例2:字符串常量的拷贝
  • strcpy(ch, p1);
#include 
#include 

int main(int argc, char *argv[])
{
	char *p1 = "hello world!";
	char ch[50] = "welcome";
		
	strcpy(ch, p1);
	
	puts(ch);
	puts(p1);
	return 0;
}

返回

hello world!
hello world!
  • strcpy(p1, ch);
#include 
#include 

int main(int argc, char *argv[])
{
	char *p1 = "hello world!";
	char ch[50] = "welcome";
		
	strcpy(p1, ch);
	
	puts(ch);
	puts(p1);
	return 0;
}

返回

Segmentation fault (core dumped)
  • 例3:实现strcat
#include 
#include 

int main(int argc, char *argv[])
{
	char *p = "my world!", *q;
	char ch[50] = "welcome to ";
	
	int i = 0;

	q = p; 
	
	while (*(ch+i)!='\0')
		i++;
	while (*p != '\0'){
		*(ch+i)=*p;
		i++;
		p++;
	}
	*(ch+i) = *p; //对地址来说等号左边可以做运算
	
	p = q;
	puts(ch);
	puts(p);
	return 0;
}

return

welcome to my world!
my world!

5.3 字符串数组指针

  • 用法char *s[] = {"ab", "bc", "cd"};
  • 把每个字符串常量存在这个数组中
  • 字符串长度sizeof(s)/sizeof(char *);
  • 字符串遍历
#include 
#include 

int main(int argc, char *argv[])
{
	char *s[] = {"apple", "pear", "orange"};
	int i, n;
	char ** p;

	i = 0;
	n = sizeof(s)/sizeof(char *);
	p = s; //p=&s[0];

	while (i<n){
		printf("%s %s\n", s[i], *(p+i));
		i++;
	}
	return -1;
}

return

apple apple
pear pear
orange orange

你可能感兴趣的:(c语言,c语言,学习,数据结构)