c语言中字符串详解

c语言字符串详解

8.1 字符数组与字符串区别

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

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

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

#include <stdio.h>

int main0801()

{

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

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

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

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

    printf("c2 = %sn", c2);

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

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

    printf("c3 = %sn", c3);

    return 0;

}

运行结果:

 

如图:

char1没有’’,输出了乱码

char2有’’,正常输出

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

8.2 字符串的初始化

#include<stdio.h>

int main()

{

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

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

    printf("buf= %sn", buf);

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

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

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

    printf("buf2=%sn", buf2);

    //所有元素赋值为0

    char buf3[100] = { 0 };

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

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

    printf("buf5=%sn", buf5);

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

    printf("buf6=%sn", buf6);

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

    printf("buf7=%sn", buf7);

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

    char buf8[] = "dgasiugduaishg";

   

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

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

    //12相当于n

   

    char str[] = "12abc";

    printf("str==%sn", str);

    return 0;

}

 

8.3 字符串的输入输出

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

#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:%sn", str);

    return 0;

}

 

如图,空格后面被忽略

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 = %sn", str);

8.3.2 puts()

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

参数:

s:字符串首地址

返回值(int):

成功:非负数

失败:-1

int main() {

printf("hello world");

puts("hello world");

return 0;

}

8.4 strlen()

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

参数:

s:字符串首地址

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

char str[] = "abcdefg";

int n = strlen(str);

printf("n = %dn", 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所指向的空间中,''也会拷贝过去

参数:

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

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

返回值(char*):

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

失败:NULL

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

char dest[20] = "123456789";

    char src[] = "hello world";

    strcpy(dest, src);

    printf("%sn", dest);

 

8.5.2 strncpy()

strncpy  (dest,  src, n);

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

参数:

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("%sn", dest); //最后一位未致0

    dest[5] = '';

    printf("%sn", dest);

}

 

8.5.3 strcat()

strcat (dest,  src);

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

参数:

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

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

返回值(char*):

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

失败:NULL

#include<stdio.h>

int main()

{

    char str[20] = "123";

    char src[] = "hello world";

    printf("%sn", strcat(str, src));

}

 

8.5.4 strncat()

strncat (dest,  src, n);

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

参数:

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("%sn", strncat(str, src, 5));

}

 

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==str2n");

   

    else if

         (strcmp(str1, str2) > 0)

         printf("str1>str2n");

   

    else

         printf("str1<str2n");

}

 

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==str2n");

   

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

         printf("str1>str2n");

   

    else

         printf("str1<str2n");

}

 

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 = %sn", p);

}

 

如图所示,第一个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 = %sn", p);

}

 

8.5.9 atoi()

atoi (nptr);

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

参数:

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

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

类似的函数有:

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

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

 

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;

}

 

现在您可能还无法透彻地理解这个实例,因为到目前为止我们还没有讨论类和对象。所以现在您可以只是粗略地看 下这个实例,等理解了面向对象的概念之后再回头来理解这个实例。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>