zoukankan      html  css  js  c++  java
  • C++字符串复习

    1、C++的字符串必须和C语言的字符串有一个好的区分。
    比如说我们在C语言里面定义字符串是使用

    char str[]="helloworld";
    

    这个时候默认为str字符串数组分配了长度为11的数组,str存放了数组的首地址,a[10]末尾以 '’为结尾,这个时候数组的总长度应11.
    定义字符串在C语言里面还可以使用指针来定义,

    char* str = "helloworld";
    

    这个时候str是一个指针(数组名不是指针),它指向了字符串字符串的首地址h,这个时候可以把字符串看成是一块内存,它的值其实相当于是一个数组的首地址,是一个常量,其实这样写是存在隐患的,下面详细解释。
    查看内存窗口:
    在这里插入图片描述
    2、一些常用的字符串库函数:
    在C中,函数原型存在 <string.h>头文件中。
    在C++中,则存在于头文件中。
    1、strcpy(s1, s2);
    原型:char * strcpy(char * destination,const char * source);
    复制字符串 s2 到字符串 s1。

    #include <iostream>
    #include <string>
    using namespace std;
    /************************************************************************/
    /* strcpy是一种C语言的标准库函数,
    /  strcpy把含有''结束符的字符串复制到另一个地址空间,返回值的类型为char*。                                                            */
    /************************************************************************/
    int main()
    {
    // 	char str1[] = "hello";
    // 	char str2[] = "world";
    	
    // 	char str1[] = "hello"; 
    // 	char* str2 = "world"; //做右值时,编译器把它当作地址,其是不可变的,作为左值时是一个常量,如"world"[1] = 'j';(报错)
    
    	char* str1 = "hello0000";  //可以通过编译,但是运行时会报错
    	//原因较为复杂,详见:https://blog.csdn.net/zhoudaxia/article/details/4325326
    	char* str2 = "world"; //做右值时,编译器把它当作地址,其是不可变的
    	char* str3 = strcpy(str1, str2);
    
    	return 0;
    }
    

    2、strcat(s1, s2);
    原型:char * strcat(char * destination,const char * source);
    连接字符串 s2 到字符串 s1 的末尾,幷返回s1的首地址。

    // 	char* str1 = "he";
    // 	char* str2 = "lloworld";
    // 	char* str = strcat(str1, str2);
    	/************************************************************************/
    	/* 上面这个是禁止的,str1所指向的内存大小只有两个字节,这个操作内存溢出,看正确的追加方式
    	/************************************************************************/
    	char str3[20] = "he";    //一定要保证空间足够大
    	char str4[10] = "lloworld";
    	char* str = strcat(str3, str4);
    	printf("
    ");
    

    3、strlen(s1);
    原型:size_t strlen(const char * str);
    返回字符串 s1 的长度。

    /************************************************************************/
    /* 它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,
    直到碰到第一个字符串结束符''为止,然后返回计数器值(长度不包含'')。                                                                   */
    /************************************************************************/
    int main()
    {
    	char* str1 = "he";
    	char* str2 = "lloworld";
    	int len1 = strlen(str1);  //遇到‘’结束,返回字节数=2
    	int len2 = sizeof(str1); //返回一个变量所占的字节数 = 4(指针占4个)
    	int len3 = strlen(str2);
    	int len4 = sizeof(str2);
    
    	printf("");
    	return 0;
    }
    

    4、strcmp(s1, s2);
    原型:int strcmp(const char * str1,const char * str2);
    如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0。

    int main()
    {
    	char str1[] = "hello";
    	char str2[] = "world";
    
    	char str3[] = "world";
    	char str4[] = "hello";
    
    	char str5[] = "world";
    	char str6[] = "world";
    	int rst1 = strcmp(str1, str2); //str1<str2返回-1
    	int rst2 = strcmp(str3, str4); //str1>str2返回1
    	int rst3 = strcmp(str5, str6); //str1==str2返回0
    
    	return 0;
    }
    

    5、strchr(s1, ch);
    原型:extern char *strchr(const char *s,char c)
    返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。

    int main()
    {
    	char str1[] = "hello";
    	char* p = strchr(str1, 'o');
    	return 0;
    }
    

    6、strstr(s1, s2);
    原型:char * strstr ( const char *, const char * );
    返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

    int main()
    {
    	char str1[] = "hello";
    	char str2[] = "llo";
    	char* p = strstr(str1,str2);
    	return 0;
    
    

    使用这些函数的时候需要特别注意char* str, char str[], const char* str 的区别,这也是C过渡到C++遗留下来令人头疼的问题。
    可以查看大佬的博客,写的挺好的:https://blog.csdn.net/zhoudaxia/article/details/4325326
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    找个时间再写一下C++的字符串使用。

  • 相关阅读:
    java常见面试题汇总(一)
    我的自学之路:java学习路线图分享
    bzoj3714 [PA2014]Kuglarz
    cf478D Red-Green Towers
    cf478C Table Decorations
    cf478B Random Teams
    cf479A Expression
    cf479C Exams
    cf479D Long Jumps
    cf479E Riding in a Lift
  • 原文地址:https://www.cnblogs.com/liuzeyu12a/p/12358984.html
Copyright © 2011-2022 走看看