C语言字符串从入门到进阶指南

举报
莫浅子 发表于 2022/12/09 11:17:39 2022/12/09
【摘要】 ​ 目录字符数组 和 字符串区别字符数组 字符串 统计字符串每个字符出现的次数字符串获取 scanfgetsfgetsputsfputsstrlen求非空字符串元素个数判断字符串是否回文字符串处理函数   字符串拷贝:  strcpy strncpy字符串拼接 strcat strncat 字符串比较    strcmp strncmp字符串格式化输入、输出sprintf字符串查找字符子串 ...

 目录

字符数组 和 字符串区别

字符数组 

字符串 

统计字符串每个字符出现的次数

字符串获取 scanf

gets

fgets

puts

fputs

strlen

求非空字符串元素个数

判断字符串是否回文

字符串处理函数   

字符串拷贝: 

 strcpy 

strncpy

字符串拼接

 strcat

 strncat 

字符串比较   

 strcmp

 strncmp

字符串格式化输入、输出

sprintf

字符串查找字符子串

 strchr()

 strrchr()

  strstr()

字符串分割

strtok()

字符串转化成浮点数

 atoi/atof/atol



字符数组 和 字符串区别

 字符数组 

 char str[5] = {'h', 'e', 'l', 'l', 'o'};    

字符串 

 char str[6] = {'h', 'e', 'l', 'l', 'o', '\0'};

 char str[6] = "hello";


 printf("%s");    使用printf打印字符串的时候,必须碰到 \0 结束。


统计字符串每个字符出现的次数

for (size_t i = 0; i < 10; i++)
	{
		scanf("%c", &str[i]);
	}

	int count[26] = {0};  // 代表26个英文字母出现的次数。 

	for (size_t i = 0; i < 11; i++)
	{
		int index = str[i] - 'a';	// 用户输入的字符在 count数组中的下标值。
		count[index]++;
	}

	for (size_t i = 0; i < 26; i++)
	{
		if (count[i] != 0)
		{
			printf("%c字符在字符串中出现 %d 次\n", i+'a', count[i]);
		}
	}




字符串获取 scanf

 1)用于存储字符串的空间必须足够大,防止溢出。 char str[5];

  2) 获取字符串,%s, 遇到空格 和 \n 终止。

 借助“正则表达式”, 获取带有空格的字符串:scanf("%[^\n]", str);

gets

从键盘获取一个字符串, 返回字符串的首地址。 可以获取带有 空格的字符串。 【不安全】

 char *gets(char *s);


 参数:用来存储字符串的空间地址。


 返回值:返回实际获取到的字符串首地址。

代码

如果输入 ni hao  输出的就是 获取的字符串为ni hao

	char str[10];

	printf("获取的字符串为:%s", gets(str));

	system("pause");
	return EXIT_SUCCESS;


fgets

 从stdin获取一个字符串, 预留 \0 的存储空间。空间足够读 \n, 空间不足舍弃 \n  【安全】

 char *fgets(char *s, int size, FILE *stream);


 参1:用来存储字符串的空间地址。

 参2:描述空间的大小。

 参3:读取字符串的位置。    键盘 --》 标准输入:std


 返回值:返回实际获取到的字符串首地址。


代码

如果输入hello world 输出hello wor

int main(void)
{
	char str[10];

	printf("获取的字符串为:%s", fgets(str, sizeof(str), stdin));

	system("pause");
	return EXIT_SUCCESS;
}


puts

将一个字符串写出到屏幕. printf("%s", "hello"); / printf("hello\n"); / puts("hello");   输出字符串后会自动添加 \n 换行符。

 int puts(const char *s);    


 参1:待写出到屏幕的字符串。


 返回值: 成功:非负数 0。 失败: -1.    

代码

int main(void)
{
	char str[] = "hello world\n";

	int ret = puts(str);	// puts("hello world");

	printf("ret = %d\n", ret);  //ret = 0 

	system("pause");
	return EXIT_SUCCESS;
}


fputs

 将一个字符串写出到stdout.输出字符串后, 不添加 \n 换行符。

 int fputs(const char * str, FILE * stream);    


 参1:待写出到屏幕的字符串。        屏幕 --》标准输出: stdout

 参数:写出位置 stdout


 返回值: 成功:0。 失败: -1.

代码

int main(void)
{
	char str[] = "hello world\n";

	//int ret = fputs(str, stdout);	//

	int ret = fputs("hello world\n", stdout);

	printf("ret = %d\n", ret);

	system("pause");
	return EXIT_SUCCESS;
}

strlen

碰到 \0 结束,不包含'\0'

size_t strlen(const char *s);


参1: 待求长度的字符串


返回:有效的字符个数。   

代码

int main(void)
{
	char str[] = "hello world";

	printf("sizeof(str) = %u\n", sizeof(str)); //输出12 
	printf("strlen(str) = %u\n", strlen(str)); //输出11 

	system("pause");
	return EXIT_SUCCESS;
}


求非空字符串元素个数


#include <stdio.h>
#include <string.h>
#include <math.h>
#include <time.h>
int no_space_str(char *str)
{
	int count = 0;

	//har str[] = "ni chou sha ";

	char* p = str;

	while (*p)
	{
		if (*p != ' ')
		{
			count++;
		}
		p++;
	}
	return count++;
}
int main()
{
	char str[] = "ni chou sha ";
	int ret = no_space_str(str);
	printf("%d", ret);
}




判断字符串是否回文

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <time.h>
//字符串逆置
void str_inserse(char* str)
{
	char* start = str;                  //记录元素首地址
	char* end = str + strlen(str) - 1;  // 记录最后一个元素地址

	while (start < end)      //首元素地址是否小于最后一个元素地址
	{
		char temp = *start;
		*start = *end;
		*end = temp;
		start++;          //首元素对应指针后移
		end--;            //尾元素对应指针前移
	}
}
//判断回文字符串 abcddcba
int str_abcba(char *str)
{
	char *start = str;
	char *end = str + strlen(str) - 1;

	while (start < end)
	{
		if (*start != *end)  //判断字符是否一致
		{
			return 0; // 0表示非回文
		}
		start++;
		end--;
	}
	return 1;
}

int main()
{
	char str[] = "this is a test";

	//str_inserse(str);

	//printf("str = %s----------------------\n", str);

	char s2[] = "abccba";

	int ret = str_abcba(s2);
	if (ret == 0) printf("不是回文\n");
	else if (ret == 1) printf("是回文\n");

}




字符串处理函数   

头文件 #include <string.h>

字符串拷贝: 

 strcpy 

 将 src 的内容,拷贝给 dest。 返回 dest。 保证dest空间足够大。【不安全】

 char *strcpy(char *dest, const char *src);

 函数调用结束 返回值和 dest参数结果一致。

如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况 


strncpy

参数

dest:目的的字符串首地址

src:原字符首要地址

n:指定需要拷贝字符串个数


将 src 的内容,拷贝给 dest。只拷贝 n 个字节。 通常 n 与dest对应的空间一致。 

默认 不添加 ‘\0’

char *strncpy(char *dest, const char *src, size_t n);    

特性: n > src: 只拷贝 src 的大小

            n < src: 只拷贝 n 字节大小。 不添加 ‘\0’

成功返回字符串dest首地址 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

// strcpy
int main0301(void)
{
	char src[] = "abc efg  zhansan wangwu ";
	char dest[10] = {0};

	char *p = strcpy(dest, src); ;// 字符串src 拷贝给dest

	printf("p= %s\n", p);
	printf("dest = %s\n", dest);

	system("pause");
	return EXIT_SUCCESS;
}
// strncpy
int main(void)
{
	char src[] = "hello world";
	char dest[100] = { 0 };

	char *p = strncpy(dest, src, 100); ;// 字符串src 拷贝给dest
	for (size_t i = 0; i < 10; i++)
	{
		printf("%c\n", p[i]);
	}

	printf("p= %s\n", p);
	printf("dest = %s\n", dest);

	system("pause");
	return EXIT_SUCCESS;
}




  

字符串拼接

 strcat

将 src 的内容,拼接到 dest 后。 返回拼接后的字符串。    保证 dest 空间足够大。


 char *strcat(char *dest, const char *src);       

 strncat 

将 src 的前 n 个字符,拼接到 dest 后。 形成一个新的字符串。保证 dest 空间足够大。


char *strncat(char *dest, const char *src, size_t n);


 函数调用结束 返回值和 dest 参数结果一致。

代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

int main0401(void)
{
	char src[] = "world";
	char dest[] = "hello";

	char *p = strcat(dest, src);

	printf("p = %s\n", p);
	printf("dest = %s\n", dest); // helloworld

	system("pause");
	return EXIT_SUCCESS;
}

int main0402(void)
{
	char src[] = "world";
	char dest[6] = "hello";

	char *p = strncat(dest, src, 3);

	printf("p = %s\n", p);
	printf("dest = %s\n", dest);

	printf("%d\n", strlen(dest));

	system("pause");
	return EXIT_SUCCESS;
}




字符串比较   

不能使用 > < >= <= == != 

 strcmp

int strcmp(const char *s1, const char *s2)

比较s1和s2两个字符串,如果相等 返回0.如果不相等,进一步表 s1 和 s2 对应位 ASCII码   值。

            s1 > s2 返回1

            s1 < s2 返回-1

 strncmp

 int strncmp(const char *s1, const char *s2, size_t n);

 比较s1和s2两个字符串的前n个字符,

 如果相等 返回0。如果不相等,进一步表 s1 和 s2 对应位 ASCII码值。(不比字符串             ASCII码的和)

  s1 > s2 返回1

  s1 < s2 返回-1        

 代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

int main0501(void)
{
	char *str1 = "helloworld";
	char *str2 = "helloz";

	printf("ret = %d\n", strcmp(str1, str2));

	system("pause");
	return EXIT_SUCCESS;
}

int main0502(void)
{
	char *str1 = "helloworld";
	char *str2 = "helloz";

	printf("ret = %d\n", strncmp(str1, str2, 8));

	system("pause");
	return EXIT_SUCCESS;
}




字符串格式化输入、输出

如果相输入带空格字符串scanf("%[^\n]", str);

sprintf

int sprintf(char *str, const char *format, ...);

功能:根据参数format字符串来转化并格式化数据,然后将结果输出到str指定的空间,直到字符串出现结束符 '/0' 为止

参数:

str 字符串首地址

format:字符串格式,用法和printf()一样

sscanf()

int sscanf(const char *str, const char *format, ...);

功能:从str指定的字符串读取数据,并根据参数fornat字符串来转化并格式化数据

参数:

      str:指定的字符串首地址

      format:字符串格式,用法和scanf()一样

代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

int main0401(void)
{
	char src[] = "world";
	char dest[] = "hello";

	char *p = strcat(dest, src);

	printf("p = %s\n", p);
	printf("dest = %s\n", dest); // helloworld

	system("pause");
	return EXIT_SUCCESS;
}

int main0402(void)
{
	char src[] = "world";
	char dest[6] = "hello";

	char *p = strncat(dest, src, 3);

	printf("p = %s\n", p);
	printf("dest = %s\n", dest);

	printf("%d\n", strlen(dest));

	system("pause");
	return EXIT_SUCCESS;
}




字符串查找字符子串


 strchr()

在字符串str中 找一个字符出现的位置。 返回字符在字符串中的地址。


char *strchr(const char *s, int c);


printf("%s\n" strchr("hehehahahoho", 'a'));  --> "ahahoho"

 strrchr()

 自右向左,在字符串str中 找一个字符出现的位置。 返回字符在字符串中的地址。


 char *strrchr(const char *s, int c);


 printf("%s\n" strrchr("hehehahahoho", 'a'));  --> "ahoho"         

  strstr()

 在字符串str中,找子串substr第一次出现的位置。返回地址。


 char *strstr(const char *str, const char *substr);

 在字符串中找子串的位置。


  printf("%s\n" strrchr("hehehahahoho", "ho"));  --> "hoho"

  printf("%s\n" strrchr("hehehahahoho", "xixi"));  --> NULL        


字符串分割

strtok()

按照既定的分割符,来拆分字符串,按 ‘ . ’   “www.baidu.com”  使用方法strtok("www.baidu.com","k");  -->变成

char *strtok(char *str, const char *delim);

            参1: 待拆分字符串

            参2: 分割符组成的“分割串”

返回:字符串拆分后的首地址。 “拆分”:将分割字符用 '\0'替换。


特性:
        1)strtok拆分字符串是直接在 原串 上操作,所以要求参1必须,可读可写(char *str = "www.baidu.com" 不行!!!)

        2)第一次拆分,参1 传待拆分的原串。    第1+ 次拆分时,参1传 NULL.


 代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

int main0701(void)
{
	char str[] = "www.itcast.cn.com.net";  // www itcast cn

	char *p = strtok(str, ".");  // 第一次拆分,参1 传 待拆分的原串。

	while (p != NULL)
	{
		p = strtok(NULL, ".");  // 第1+ 次拆分是,参1传 NULL.

		printf("%s\n", p);     //输出itcast cn  com net (null)
	}
	system("pause");
	return EXIT_SUCCESS;
}


字符串转化成浮点数


 atoi/atof/atol

     
 使用这类函数进行转换,要求,原串必须是可转换的字符串。

 错误使用:"abc123" --> 0;    "12abc345" ---> 12;  "123xyz" -->123
     

 atoi:字符串 转 整数。 int atoi(const char *nptr);

 atof:字符串 转 浮点数

 atol:字符串 转 长整数     

代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

static int a = 1034673;

void test1(void)
{
	static int b = 0;

	printf("b = %d\n", b++);
}


int main0801(void)
{
	char str[] = "abc345";
	int num = atoi(str);
	printf("num = %d\n", num);

	char str1[] = "     -10";
	int num1 = atoi(str1);
	printf("num1 = %d\n", num1);

	char str2[] = "0.123f";
	double num2 = atof(str2);
	printf("num2 = %.2lf\n", num2);

	char str3[] = "123L";
	long num3 = atol(str3);
	printf("num3 = %ld\n", num3);

	system("pause");
	return EXIT_SUCCESS;
}


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。