c语言中字符串详解

这篇具有很好参考价值的文章主要介绍了c语言中字符串详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

c语言字符串详解

8.1 字符数组与字符串区别

C语言中没有字符串这种数据类型,可以通过char型数组来替代; 注意:

C语言中,字符串一定是一个char型数组,但char型数组未必是字符串;

在C语言的char型数组中,数字0(和字符‘\0’等价)结尾的char数组就是一个字符串,但如果char型数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的char的数组。

#include <stdio.h>

int main0801()

{

    char c1[] = { 'c', ' ', 'p', 'r', 'o', 'g' }; //普通字符数组

    printf("c1 = %s\n", c1); //乱码,因为没有’\0’结束符

    //以‘\0’(‘\0’就是数字0)结尾的字符数组是字符串

    char c2[] = { 'c', ' ', 'p', 'r', 'o', 'g', '\0' };

    printf("c2 = %s\n", c2);

    //字符串处理以‘\0’(数字0)作为结束符,后面的'h', 'l', 'l', 'e', 'o'不会输出

    char c3[] = { 'c', ' ', 'p', 'r', 'o', 'g', '\0', 'h', 'l', 'l', 'e', 'o', '\0' };

    printf("c3 = %s\n", c3);

    return 0;

}

运行结果:

c语言中字符串详解

 

如图:

char1没有’\0’,输出了乱码

char2有’\0’,正常输出

char3中遇到第一个\0后,之后的字符串就不再输出。

8.2 字符串的初始化

#include<stdio.h>

int main()

{

    //不指定长度,没有0结束符,有多少个元素就有多长

    char buf[] = { 'a','b','c' };

    printf("buf= %s\n", buf);

    //指定长度,后面没有赋值的元素,自动补0

    char buf2[100] = { 'a','b','c' };

    char buf[1000] = { "hello" };

    printf("buf2=%s\n", buf2);

    //所有元素赋值为0

    char buf3[100] = { 0 };

    //char buf4[2] = { '1','2','3' };//数组越界

    char buf5[50] = { '1','a','b','0','7' };

    printf("buf5=%s\n", buf5);

    char buf6[50] = { '1','a','b',0,'7' };

    printf("buf6=%s\n", buf6);

    char buf7[50] = { '1','a','b','\0','7' };

    printf("buf7=%s\n", buf7);

    //使用字符串初始化,编译器自动在后面补0,常用

    char buf8[] = "dgasiugduaishg";

   

    //'\0'后面最好不要连着数字,有可能几个数字连起来正好是一个转义字符

    //'\ddd'八进制字义字符,'\xdd'十六进制转义字符

    //\012相当于\n

   

    char str[] = "\012abc";

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

    return 0;

}

c语言中字符串详解

 

8.3 字符串的输入输出

由于字符串采用了'\0'标志,字符串的输入输出将变得简单方便。

#define  _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

int main()

{

    char str[100];

    printf("input string1:\n");

    scanf("%s", str);//scanf("%s", str);默认以空格为分隔

    printf("output:%s\n", str);

    return 0;

}

c语言中字符串详解

 

如图,空格后面被忽略

8.3.1 gets()

功能:从标准输入读入字符,并保存到s指定的内存空间,直到出现换行符或读到文件结尾为止。

参数:

s:字符串首地址

返回值(char*):

成功:读入的字符串

失败:NULL

gets(str)与scanf("%s", str)的区别:

gets(str)允许输入的字符串含有空格

scanf("%s", str)不允许含有空格

注意:由于scanf()和gets()无法知道字符串s大小,必须遇到换行符或读到文件结尾为止才接收输入,因此容易导致字符数组越界(缓冲区溢出)的情况,所以我们在定义char型数组时,应该确保其空间足够大。

char str[100];

printf("请输入str: ");

gets(str);

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

8.3.2 puts()

功能:标准设备输出s字符串,在输出完成后自动输出一个'\n'。

参数:

s:字符串首地址

返回值(int):

成功:非负数

失败:-1

int main() {

printf("hello world");

puts("hello world");

return 0;

}

8.4 strlen()

功能:计算指定指定字符串s的长度,不包含字符串结束符‘\0’

参数:

s:字符串首地址

返回值:字符串s的长度(unsigned  int)

char str[] = "abc\0defg";

int n = strlen(str);

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

实践时间(10分钟)

1. 根据案例需求,用C或C++语言编写代码,完成程序。

案例:字符串追加

使用C语言编写一段程序,要求不允许使用标准库函数,在一串字符串后面追加另一串字符串,使得两串字符串拼接在一起

1.   输入两串字符串

2.   在不使用标准库函数的情况下将第二串字符串内容拼接到第一串字符串末尾,使得两串字符串拼接成为全新的 字符串。

3.   将新的字符串打印在屏幕上。

示例:

#include<stdio.h>

//#include<string.h>

int main()

{

    char s1[200];

    char s2[100];

    printf("输入第一个字符串");

    gets(s1);

    printf("输入第二个字符串");

    gets(s2);

    int i=0, j;

    while (s1[i] !=0)

    {

         i++;

    }

    for (i, j = 0; s2[j] !=0; i++, j++)//只用在s1的后面接上即可

    {

         s1[i] = s2[j];

    }

    s1[i] = 0;//不把最后一位手动变成0,会导致乱码

    puts(s1);   

}

8.5 字符串处理相关函数

8.5.1 strcpy()

strcpy  (dest,  src);

功能:把src所指向的字符串复制到dest所指向的空间中,'\0'也会拷贝过去

参数:

dest:目的字符串首地址(char*)

src:源字符首地址(const char*)

返回值(char*):

成功:返回dest字符串的首地址

失败:NULL

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

char dest[20] = "123456789";

    char src[] = "hello world";

    strcpy(dest, src);

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

c语言中字符串详解

 

8.5.2 strncpy()

strncpy  (dest,  src, n);

功能:把src指向字符串的前n个字符复制到dest所指向的空间中,是否拷贝结束符看指定的长度是否包含'\0'。

参数:

dest:目的字符串首地址(char*)

src:源字符首地址(const char*)

n:指定需要拷贝字符串个数(unsigned int)

返回值(char*):

成功:返回dest字符串的首地址

失败:NULL

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>

#include<string.h>

int main()

{

    char dest[20];

    char src[] = "hello world";

    strncpy(dest, src, 5);

    printf("%s\n", dest); //最后一位未致0

    dest[5] = '\0';

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

}

c语言中字符串详解

 

8.5.3 strcat()

strcat (dest,  src);

功能:将src字符串连接到dest的尾部,‘\0’也会追加过去

参数:

dest:目的字符串首地址(char*)

src:源字符首地址(const char*)

返回值(char*):

成功:返回dest字符串的首地址

失败:NULL

#include<stdio.h>

int main()

{

    char str[20] = "123";

    char src[] = "hello world";

    printf("%s\n", strcat(str, src));

}

c语言中字符串详解

 

8.5.4 strncat()

strncat (dest,  src, n);

功能:将src字符串前n个字符连接到dest的尾部,‘\0’也会追加过去

参数:

dest:目的字符串首地址(char*)

src:源字符首地址(const char*)

n:指定需要追加字符串个数(unsigned int)

返回值(char*):

成功:返回dest字符串的首地址

失败:NULL

#include<stdio.h>

int main()

{

    char str[20] = "123";

    char src[] = "hello world";

    printf("%s\n", strncat(str, src, 5));

}

c语言中字符串详解

 

8.5.5 strcmp()

strcmp  (s1, s2);

功能:比较  s1 和 s2 的大小,比较的是字符ASCII码大小

参数:

s1:字符串1首地址(const char *)

s2:字符串2首地址(const char *)

返回值(int):

相等:0

大于:>0 在不同操作系统strcmp结果会不同  返回ASCII差值

小于:<0

#include<stdio.h>

#include<string.h>

int main()

{

    char str1[] = "hello world";

    char str2[] = "hello mike";

   

    if (strcmp(str1, str2) == 0)

         printf("str1==str2\n");

   

    else if

         (strcmp(str1, str2) > 0)

         printf("str1>str2\n");

   

    else

         printf("str1<str2\n");

}

c语言中字符串详解

 

8.5.6 strncmp()

strcmp  (s1, s2, n);

功能:比较  s1 和 s2 前n个字符的大小,比较的是字符ASCII码大小。

参数:

s1:字符串1首地址(const char *)

s2:字符串2首地址(const char *)

n:指定比较字符串的数量(unsigned int)

返回值(int):

相等:0

大于:>0

小于:<0

#include<stdio.h>

#include<string.h>

int main()

{

    char str1[] = "hello world";

    char str2[] = "hello mike";

   

    if (strncmp(str1, str2, 5) == 0)

         printf("str1==str2\n");

   

    else if (strcmp(str1, "hello world") > 0)

         printf("str1>str2\n");

   

    else

         printf("str1<str2\n");

}

c语言中字符串详解

 

8.5.7 strchr()

strchr(s, c);

功能:在字符串s中查找字母c出现的位置

参数:

s:字符串首地址(const char *)

c:匹配字母(字符)(int)

返回值(char*):

成功:返回第一次出现的c地址

失败:NULL

#include<stdio.h>

#include<string.h>

int main()

{

    char src[] = "ddda123abcd";

    char* p = strchr(src, 'a');

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

}

c语言中字符串详解

 

如图所示,第一个a前面的字符串被省略

8.5.8 strstr()

strstr (haystack, needle);

功能:在字符串haystack中查找字符串needle出现的位置

参数:

haystack:源字符串首地址(const char*)

needle:匹配字符串首地址(const char*)

返回值(char*):

成功:返回第一次出现的needle地址

失败:NULL

#include<stdio.h>

#include<string.h>

int main()

{

    char src[] = "ddddabcd123abcd333abcd";

    char* p = strstr(src, "abcd");

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

}

c语言中字符串详解

 

8.5.9 atoi()

atoi (nptr);

功能:atoi()会扫描nptr字符串,跳过前面的空格字符,直到遇到数字或正负号才开始做转换,而遇到非数字或字符 串结束符('\0')才结束转换,并将结果返回返回值。

参数:

nptr:待转换的字符串(const char*)

返回值:成功转换后整数(int)

类似的函数有:

l atof():把一个小数形式的字符串转化为一个浮点数。

l atol():将一个字符串转化为long类型

c语言中字符串详解

 

8.6 简单了解C++的string类

C++  标准库提供了 string 类类型,支持上述所有的操作,另外还增加了其他更多的功能。我们现在简单了解一下 C++  标准库中的这个类,现在让我们先来看看下面这个实例:

#include <iostream>

#include <string>

using namespace std;

int main()

{

    string str1 = "Hello";

    string str2 = "World";

    string str3;

   

    int  len;

    // 复制    str1 到    str3

    str3 = str1;

    cout << "str3 : " << str3 << endl;

   

    // 连接    str1 和    str2

    str3 = str1 + str2;

    cout << "str1 + str2 : " << str3 << endl;

   

    // 连接后,str3 的总长度

    len = str3.size();

    cout << "str3.size() :  " << len << endl;

    return 0;

}

c语言中字符串详解

 

现在您可能还无法透彻地理解这个实例,因为到目前为止我们还没有讨论类和对象。所以现在您可以只是粗略地看 下这个实例,等理解了面向对象的概念之后再回头来理解这个实例。文章来源地址https://www.toymoban.com/news/detail-403697.html

到了这里,关于c语言中字符串详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言——详解字符函数和字符串函数(一)

    Hi,铁子们好呀!今天博主来给大家更一篇C语言的字符函数和字符串函数~ 具体讲的内容如下: 前言: 在编程的过程中,我们经常要处理字符和字符串,C语言标准库中提供了一系列库函数,接下来我们就学习一下这些函数。 众所周知,C语言中提供了一系列的字符函数,这些

    2024年03月17日
    浏览(55)
  • C语言——详解字符函数和字符串数组(上)

    目录 一、strlen的使用和模拟实现 1.strlen()函数的介绍 2.strlen()函数的具体使用 3.strlen函数的注意事项 4.strlen函数的模拟实现 二、strcpy的使用和模拟实现 1.strcpy()函数的介绍 2.strcpy()函数的具体使用 3.strcpy()函数的注意事项 4.strcpy函数的模拟实现 三、strcat 的使用和模拟实现  1

    2024年01月16日
    浏览(54)
  • C语言字符串初始化详解:用常量字符串进行字符数组初始化

    简介 字符串初始化 用常量字符串 初始化过程 示范代码 结论 在C语言中,字符串被定义为字符数组。字符串的初始化是指将一个常量字符串复制到字符数组中。本文将详细介绍字符串的初始化方法,并提供相应的示范代码。 在C语言中,有几种常用的方法可以用常量字符串来

    2024年02月15日
    浏览(60)
  • Java语言:字符型的详解、字符串的比较

    目录 前言 一.字符型的知识 二.字符型比较大小 三.字符串比较 equals()方法 equalslgnoreCase()方法 compareTo() 方法 🎁博主介绍:博客名为tq02,已学C语言、JavaSE,目前学了MySQL和JavaWeb 🎥学习专栏:  C语言         JavaSE       MySQL基础 🎄博主链接:tq02的博客_CSDN博客-C语言,Ja

    2024年02月13日
    浏览(76)
  • 【C语言】字符与字符串---从入门到入土级详解

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022 目录 一.字符类型和字符数组(串)简介 1.ASCII 2.定义,初始化,使用 1字符的定义及初始化 2字符串的定义及初始化 二.字符 1.字符的输入与输出 2.常见字符操作函数    1字符大小写转换    2字符类型

    2024年03月17日
    浏览(46)
  • 【进阶C语言】字符函数和字符串函数(万文详解)

    前言 C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。 字符串常量适用于那些对它不做修改的字符串函数. 今天将带来C语言函数的使用介绍 分为三部分供大家理解 如果这份博客对大家有帮助,希望

    2024年01月18日
    浏览(65)
  • C语言——字符串函数(七千字详解)

    目录 1、字符串函数 长度不受限制的字符串函数 1.1strlen 注意事项: strlen函数的使用  strlen函数的模拟实现  1.2strcpy 注意事项: strcpy函数的使用  strcpy函数的模拟实现  1.3strcat 注意事项 strcat函数的使用 strcat函数的模拟实现  1.4strcmp strcmp的返回值 strcmp函数的使用 strcmp函数

    2024年02月04日
    浏览(39)
  • 【C语言】【字符串函数】【超详解】【下】!!!

    字符串函数【上】: 【C语言】【字符串函数】【超详解】【上】!!!-CSDN博客 前言: 在上一篇中,我们已经详细讲解了C语言字符串函数中用到最多的几种函数的使用及其模拟实现,本篇我们就将学习C语言字符串函数中,一些非常实用但稍有难度的几个字符串函数。 1、

    2024年03月18日
    浏览(52)
  • C语言 strtok字符串分割函数详解

    strtok 函数的作用是比较独特的,可以用来对字符串进行分割,对于我们获取命令或者数据集合后的数据处理是不可或缺的一步。但是详细介绍 strtok 的博文很少,而且linux手册的介绍也比较简单,这边写篇博文记录一下学习到的这个函数的用法。 函数定义如下: 即从字符串

    2024年02月12日
    浏览(44)
  • C语言左旋字符串详解(付完整代码)

      目录 暴力求解 优雅求解 左旋字符串,实现一个函数,可以左旋字符串中的k个字符。 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB  每左旋转1个字符串,旋转k次,这种方法效率比较低,因为在多次旋转过程中,某几个字符要多次移动。 把整个字符串从待旋转

    2024年02月10日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包