精华内容
下载资源
问答
  • 格式化json字符串工具

    2018-09-07 17:18:06
    可以快速格式化json字符串数据,方便快捷复制key以及value
  • Visual Basic快捷教程——数组与字符

    千次阅读 热门讨论 2010-10-18 20:11:00
    将原子型数据按照一定的规则重组,就可以形成结构化数据,数组可以被认为是一种简单、朴素的结构化数据类型。字符串可以看成是一种特殊的数组,其中每个元素都是一个字符,所以字符串类型所表示的就是一系列的...

    在程序设计语言中,每一个数据都属于某种数据类型。类型明显或隐含地规定了数据的取值范围、存储方式以及允许进行的运算。这些已经事先定义好的数据类型就是所谓的原子型。然而,当今世界纷繁复杂,人们每天面对着林林总总的事物,信息从各个方面以多种多样的形态呈现在人们面前,仅仅使用原子型数据很难有效地抽象现实问题。


    因为人们所面对的数据量有时是非常巨大的,所以如果没有一个有效的方法来存储、组织和表示信息,那么信息将变得没有任何价值。即使面对一组相对较小的信息时,一个结构化的数据表示方法也是必不可少的。假想公共汽车站等车的人不按顺序争先恐后地抢着上车那么场面将是多么混乱!相反,如果人们排着队井然有序地逐个上车情况就好得多。


    将原子型数据按照一定的规则重组,就可以形成结构型数据,这种将原子型数据组织成结构型数据的过程中所使用的模型,就是数据结构。或者说,数据结构就是一个信息的结构化表示,是为了将原子型数据组织成结构化数据而套用的某种组织模型。
    数组可以被认为是一种最简单、最朴素的数据结构。数组的产生源于现实世界中最频繁出现的一类问题解决方式。

      展开全文
    • 根据全局热键,托盘和QSetting制作的通过快捷键复制指定字符串的小工具,附上源码,希望对你有用。
    • C++ 字符串与字符数组 详解

      万次阅读 多人点赞 2018-03-03 19:28:22
      在C++中,有两种类型的字符串表示形式: C-风格字符串 C++引入的string类 C-风格字符串 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。...

      在C++中,有两种类型的字符串表示形式:

      • C-风格字符串
      • C++引入的string类

      C-风格字符串

      C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。
      下面的声明和初始化创建了一个 “Hello” 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 “Hello” 的字符数多一个。

      char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

      其实,您不需要把 null 字符放在字符串常量的末尾。C++ 编译器会在初始化数组时,自动把 ‘\0’ 放在字符串的末尾。所以也可以利用下面的形式进行初始化

      char greeting[] = "Hello";

      以下是 C/C++ 中定义的字符串的内存表示:
      这里写图片描述
      C++ 中有大量的函数用来操作以 null 结尾的字符串:

      序号函数功能
      1strcpy(s1,s2)复制字符串 s2 到字符串 s1
      2strcat(s1,s2)连接字符串 s2 到字符串 s1 的末尾
      3strlen(s1)返回字符串 s1 的长度
      4strcmp(s1,s2)返回s1与s2的比较结果
      5strchr(s1,ch)返回一个指针,指向字符串s1中字符ch的第一次出现的位置
      6strstr(s1,s2)返回一个指针,指向字符串s1中s2的第一次出现的位置

      C++ 中的 String 类

      C++ 标准库提供了 string 类类型,支持上述所有的操作,另外还增加了其他更多的功能。比如:

      • append() – 在字符串的末尾添加字符
      • find() – 在字符串中查找字符串
      • insert() – 插入字符
      • length() – 返回字符串的长度
      • replace() – 替换字符串
      • substr() – 返回某个子字符串

      4种字符串类型

      C++中的字符串一般有以下四种类型,

      • string

      • char*

      • const char*
      • char[]

      下面分别做简单介绍,并说明其中的一些区别

      string

      string是一个C++类库中的一个类,它位于名称空间std中,因此必须使用using编译指令或者std::string来引用它。它包含了对字符串的各种常用操作,它较char*的优势是内容可以动态拓展,以及对字符串操作的方便快捷,用+号进行字符串的连接是最常用的操作

      char*

      char* 是指向字符串的指针(其实严格来说,它是指向字符串的首个字母),你可以让它指向一串常量字符串。

      const char*

      该声明指出,指针指向的是一个const char类型,即不能通过当前的指针对字符串的内容作出修改

      注意这里有两个概念:

      • char * const [指向字符的静态指针]
      • const char * [指向静态字符的指针]

      前者const修饰的是指针,代表不能改变指针
      后者const修饰的是char,代表字符不能改变,但是指针可以变,也就是说该指针可以指针其他的const char。

      char[]

      与char*与许多相同点,代表字符数组,可以对应一个字符串,如

      char * a="string1";
      char b[]="string2";

      这里a是一个指向char变量的指针,b则是一个char数组(字符数组)
      也就是说:

      二者的不同点

      一,char*是变量,值可以改变, char[]是常量,值不能改变!
      a是一个char型指针变量,其值(指向)可以改变;
      b是一个char型数组的名字,也是该数组首元素的地址,是常量,其值不可以改变

      二,char[]对应的内存区域总是可写,char*指向的区域有时可写,有时只读
      比如:

      char * a="string1";
      char b[]="string2";
      gets(a); //试图将读入的字符串保存到a指向的区域,运行崩溃! 
      gets(b) //OK

      解释: a指向的是一个字符串常量,即指向的内存区域只读;
      b始终指向他所代表的数组在内存中的位置,始终可写!

      注意,若改成这样gets(a)就合法了:

      char * a="string1";
      char b[]="string2";
      a=b; //a,b指向同一个区域
      gets(a) //OK
      printf("%s",b) //会出现gets(a)时输入的结果

      解释: a的值变成了是字符数组首地址,即&b[0],该地址指向的区域是char *或者说 char[8],习惯上称该类型为字符数组,其实也可以称之为“字符串变量”,区域可读可写。

      总结:char *本身是一个字符指针变量,但是它既可以指向字符串常量,又可以指向字符串变量,指向的类型决定了对应的字符串能不能改变!

      三,char * 和char[]的初始化操作有着根本区别:
      测试代码:

      char *a="Hello World"; 
      char b[]="Hello World"; 
      printf("%s, %d\n","Hello World", "Hello World"); 
      printf("%s, %d %d\n", a, a,  &a);                           
      printf("%s, %d %d\n", b,     b,  &b);

      结果:

      Hello World,13457308
      Hello World,13457308    2030316
      Hello World,2030316 2030316

      结果可见:尽管都对应了相同的字符串,但”Hellow World”的地址 和 a对应的地址相同,与b指向的地址有较大差异;&a 、&b都是在同一内存区域,且&b==b
      根据c内存区域划分知识,我们知道,局部变量都创建在栈区,而常量都创建在文字常量区,显然,a、b都是栈区的变量,但是a指向了常量(字符串常量),b则指向了变量(字符数组),指向了自己(&b==b==&b[0])。
      说明以下问题:
      char * a=”string1”;是实现了3个操作:

      1. 声明一个char*变量(也就是声明了一个指向char的指针变量);
      2. 在内存中的文字常量区中开辟了一个空间存储字符串常量”string1”
      3. 返回这个区域的地址,作为值,赋给这个字符指针变量a

      最终的结果:指针变量a指向了这一个字符串常量“string1”
      (注意,如果这时候我们再执行:char * c=”string1”;则,c==a,实际上,只会执行上述步骤的1和3,因为这个常量已经在内存中创建)

      char b[]=”string2”;则是实现了2个操作:

      1. 声明一个char 的数组,
      2. 为该数组“赋值”,即将”string2”的每一个字符分别赋值给数组的每一个元素

      最终的结果:“数组的值”(注意不是b的值)等于”string2”,而不是b指向一个字符串常量

      实际上, char * a=”string1”; 的写法是不规范的!
      因为a指向了即字符常量,一旦strcpy(a,”string2”)就糟糕了,试图向只读的内存区域写入,程序会崩溃的!尽管VS下的编译器不会警告,但如果你使用了语法严谨的Linux下的C编译器GCC,或者在windows下使用MinGW编译器就会得到警告。
      所以,我们还是应当按照”类型相同赋值”的原则来写代码:

      const char * a="string1";

      保证意外赋值语句不会通过编译

      另外,关于char*和char[]在函数参数中还有一个特殊之处,运行下面的代码

      void fun1 ( char *p1,  char p2[] ) {
       printf("%s %d %d\n",p1,p1,&p1);
       printf("%s %d %d\n",p2,p2,&p2);
      p2="asdf"; //通过! 说明p2不是常量! 
      printf("%s %d %d\n",p2,p2,&p2);
      }
      void main(){
      char a[]="Hello";
      fun1(a,a);
      }

      运行结果:

      Hello 3471628 3471332
      Hello 3471628 3471336
      asdf 10704764 3471336

      结果出乎意料!上面结果表明p2这时候根本就是一个指针变量!
      结论是:作为函数的形式参数,两种写法完全等效的!都是指针变量!

      const char*与char[]的区别:
      const char * a=”string1”
      char b[]=”string2”;
      二者的区别在于:

      1. a是const char 类型, b是char const类型
        ( 或者理解为 (const char)xx 和 char (const xx) )

      2. a是一个指针变量,a的值(指向)是可以改变的,但a只能指向(字符串)常量,指向的区域的内容不可改变;

      3. b是一个指针常量,b的值(指向)不能变;但b指向的目标(数组b在内存中的区域)的内容是可变的

      4. 作为函数的声明的参数的时候,char []是被当做char *来处理的!两种形参声明写法完全等效!

      字符串类型之间的转换: string、const char*、 char* 、char[]相互转换

      一、转换表格

      源格式->目标格式stringchar*const char*char[]
      stringNULL直接赋值直接赋值直接赋值
      char*strcpyNULLconst_castchar*=char
      const char*c_str()直接赋值NULLconst char*=char;
      char[]copy()strncpy_s()strncpy_s()NULL

      二、总结方法:

      1. 变成string,直接赋值。
      2. char[]变成别的,直接赋值。
      3. char*变constchar*容易,const char*变char*麻烦。<const_cast><char*>(constchar*);
      4. string变char*要通过const char*中转。
      5. 变成char[]。string逐个赋值,char* const char* strncpy_s()。

      三,代码示例

      1、string转为其他类型

      ①、string转const char*

      #include "stdafx.h"
      #include <iostream>
      int _tmain(intargc, _TCHAR* argv[])
      {
          std::string str = "HelloWorld!";     //初始化string类型,并具体赋值
          const char* constc = nullptr;         //初始化const char*类型,并赋值为空
          constc= str.c_str();                 //string类型转const char*类型
          printf_s("%s\n", str.c_str());        //打印string类型数据 .c_str()
          printf_s("%s\n", constc);             //打印const char*类型数据
          return 0;
      }

      ②、string转char*

      #include "stdafx.h"
      #include <iostream>
      int _tmain(intargc, _TCHAR* argv[])
      {
          std::string str = "HelloWorld!";     //初始化string类型,并具体赋值
          char* c = nullptr;                    //初始化char*类型,并赋值为空
          const char* constc = nullptr;         //初始化const char*类型,并赋值为空
          constc= str.c_str();                 //string类型转const char*类型
          c= const_cast<char*>(constc);        //const char*类型转char*类型
          printf_s("%s\n", str.c_str());        //打印string类型数据 .c_str()
          printf_s("%s\n",c);                  //打印char*类型数据
          return 0;
      
      }

      ③、string转char[]

      #include "stdafx.h"
      #include <iostream>
      int _tmain(intargc, _TCHAR* argv[])
      {
          std::string str = "HelloWorld!";      //初始化string类型,并具体赋值
          char arrc[20] = {0};                   //初始化char[]类型,并赋值为空
          for (int i = 0; i < str.length(); i++) //string类型转char[]类型
          {
              arrc[i]=str[i];
          }
          printf_s("%s\n", str.c_str());         //打印string类型数据 .c_str()
          printf_s("%s\n", arrc);                //打印char[]类型数据
          return 0;
      }

      2、const char*转为其他类型

      ①const char*转string

      #include "stdafx.h"
      #include <iostream>
      int _tmain(intargc, _TCHAR* argv[])
      {
          const char* constc = "Hello World!";     //初始化const char* 类型,并具体赋值
          std::string str;                        //初始化string类型
          str= constc;                            //const char*类型转string类型
          printf_s("%s\n", constc);                //打印const char* 类型数据
          printf_s("%s\n", str.c_str());           //打印string类型数据
          return 0;
      }

      ②const char*转char*

      #include "stdafx.h"
      #include <iostream>
      int _tmain(intargc, _TCHAR* argv[])
      {
          const char* constc = "Hello World!";     //初始化const char* 类型,并具体赋值
          char* c = nullptr;                       //初始化char*类型
          c= const_cast<char*>(constc);           //const char*类型转char*类型
          printf_s("%s\n", constc);                //打印const char* 类型数据
          printf_s("%s\n", c);                     //打印char*类型数据
          return 0;
      }

      ③const char*转char[]

      #include "stdafx.h"
      #include <iostream>
      int _tmain(intargc, _TCHAR* argv[])
      {
          const char* constc = "Hello World!";     //初始化const char* 类型,并具体赋值
          char arrc[20] = { 0 };                   //初始化char[]类型,并赋值为空
          strncpy_s(arrc,constc,20);              //const char*类型转char[]类型
          printf_s("%s\n", constc);                //打印const char* 类型数据
          printf_s("%s\n", arrc);                  //打印char[]类型数据
          return 0;
      }

      3、char*转为其他类型

      ①char*转string

      #include "stdafx.h"
      #include <iostream>
      int _tmain(intargc, _TCHAR* argv[])
      {
          char* c = "HelloWorld!";           //初始化char* 类型,并具体赋值
          std::string str;                   //初始化string类型
          str= c;                            //char*类型转string类型
          printf_s("%s\n", c);                //打印char* 类型数据
          printf_s("%s\n", str.c_str());      //打印string类型数据
          return 0;
      }

      ②char*转const char*

      #include "stdafx.h"
      #include <iostream>
      int _tmain(intargc, _TCHAR* argv[])
      {
          char* c = "HelloWorld!";         //初始化char* 类型,并具体赋值
          const char* constc = nullptr;     //初始化const char* 类型,并具体赋值
          constc= c;                       //char*类型转const char* 类型
          printf_s("%s\n", c);              //打印char* 类型数据
          printf_s("%s\n", constc);         //打印const char* 类型数据
          return 0;
      }

      ③char*转char[]

      #include "stdafx.h"
      #include <iostream>
      int _tmain(intargc, _TCHAR* argv[])
      {
          char* c = "HelloWorld!";         //初始化char* 类型,并具体赋值
          char arrc[20] = { 0 };           //初始化char[] 类型,并具体赋值
          strncpy_s(arrc,c,20);             //char*类型转char[] 类型
          printf_s("%s\n", c);              //打印char* 类型数据
          printf_s("%s\n", arrc);           //打印char[]类型数据
          return 0;
      }

      4、char[]转为其他类型

      #include "stdafx.h"
      #include <iostream>
      int _tmain(intargc, _TCHAR* argv[])
      {
          char arrc[20] = "HelloWorld!";//初始化char[] 类型并具体赋值
          std::string str;                 //初始化string
          const char* constc = nullptr;   //初始化const char*
          char*c = nullptr;                //初始化char*
          str= arrc;                     //char[]类型转string类型
          constc= arrc;             //char[]类型转const char* 类型
          c= arrc;                        //char[]类型转char*类型
          printf_s("%s\n", arrc);         //打印char[]类型数据
          printf_s("%s\n", str.c_str());  //打印string类型数据
          printf_s("%s\n", constc);       //打印const char* 类型数据
          printf_s("%s\n", c);            //打印char*类型数据
          return 0;
      }
      展开全文
    • 在程序设计中,为了方便处理,...因此按照数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。 本文主要介绍一维数组、二维数组和字符数组,其余的数组将会在以后的文章中介绍到...

      在程序设计中,为了方便处理,通常把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据结构。一个数组可以分解成多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按照数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。

      本文主要介绍一维数组、二维数组和字符数组,其余的数组将会在以后的文章中介绍到。

       

      数组概述

      数组就是用来存储和处理一组相同类型的数据的。

      数组在C语言中有着特殊的地位,它有很多的特性,比如它的存储是连续的、数组的名称是数组的地址等。

      一维数组

      一维数组是使用同一个数组名存储一组数据类型相同的数据,用索引或下标区别数组中的不同元素。

      • 一维数组的定义方式为:
      类型说明符 数组名[常量表达式]

      在定义数组时,应该注意以下几点:

      1. 数组使用的方括号[],不是小括号;
      2. 常量表达式表示数据元素的个数,必须是一个正的整数值,不能含有变量,但是可以是符号常量或者常量表达式;
      3. 数组定义后,其长度不可更改。
      • 一维数组的数据元素的一般形式为:
      数组名[下标]

      在引用数组元素时,应该注意以下几点:

      1. 一位数组元素的下标从0开始,最大下标为n-1;
      2. 在C语言中只能逐个地使用数组元素,而不能一次引用整个数组。
      • 一维数组的初始化:除了用赋值语句对数组元素逐个赋值外,还可采用初始化赋值和动态赋值的方法。

      初始化赋值的一般形式为:

      类型说明符 数组名[常量表达式] = {初始值表};
      
      int a[5]={1,2,3,4,5};

      在初始化赋值时,应该注意以下几点:

      1. 数组定义时初始化可以整体赋初值,但是除了定义初始化之外,不能整体赋值!
      2. 当初始值表给出全部元素值时,可以不给出数组元素的个数;
      3. 可以只给部分数组中的部分元素赋初始值(没有赋值的位将补0)。也就是说可以这样:
      int a[]={1,2,3,4,5};
      int b[5]={1,2,3};

      二维数组

      • 二维数组定义的一般形式为:
      类型说明符 数组名[常量表达式1][常量表达式2];

      二维数组被定义后,编译系统将为该数组在内存中分配一片连续的存储空间,按行的顺序连续存储数组的各个元素。即先顺序存储第一行元素,再存储第二行元素……直到存储最后一行元素。数组名代表着数组的起始地址。

      • 二维数组元素引用的基本语法格式为:
      数组名[下标][下标]
      • 初始化赋值的一般形式为:
      类型说明符 数组名[常量表达式1][常量表达式2] = {初始值表};
      
      int a[3][4] = { { 1,2,3,4 },{ 5,6,7,8 },{ 9,0,1,2 } };

      由于二维数组在内存中是按照线性顺序存储的,所以内存括号可以省去,不会产生影响。也就是说可以这样:

      int a[3][4] = { 1,2,3,4,5,6,7,8,9,0,1,2 };

      在初始化赋值时,应该注意以下几点:

      1. 当初始值表给出全部元素值时,可以不给出二维数组的常量表达式1(但常量表达式2必须给);
      2. 可以只给部分数组中的部分元素赋初始值(没有赋值的位将补0)。也就是说可以这样:
      int a[][4] = { { 1,2,3,4 },{ 5,6,7,8 },{ 9,0,1,2 } };
      int a[][4] = { 1,2,3,4,5,6,7,8,9,0,1,2 };
      int b[3][4] = { { 1 },{ 5 },{ 9 } };

      在这里,省去3是可以的,但是4不能省去的。编译器会根据所附的数值的个数以及数组的列数,自动计算出数组的行数。

      数组是一种构造类型的数据。二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都是一个数组,就组成了二维数组。当然前提是各元素的类型必须相同。根据这样的分析,一个二维数组也可以分解成多个一维数组。C语言允许这样的分解。如二维数组a[3][4],可以分解成3个一维数组,a[0]、a[1]、a[2]。

      数组与链表的区别:

      • 从逻辑结构上来看,数组必须实现定义固定的长度,不能适应数据动态增减的情况。当数据增加时,可能会造成空间的不够;当数据减少时,可能造成空间浪费。而链表动态地进行存储分配,可以适应数据动态增减的情况,方便插入和删除;
      • 从内存储存上来看,数组从栈中分配空间,方便快捷,但自由度小。而链表从堆中分配空间,自由度大,但申请管理比较麻烦。

       

      字符数组与字符串

      字符数组的说明与初始化

      用于存放字符的数组称为字符数组,它是数组的一种特殊类型,字符数组的每个元素存放一个字符。

      • 字符数组的定义的一般形式为:
      char 数组名[常量表达式];
      char 数组名[常量表达式1][常量表达式2];
      • 字符数组的初始化:除了数组的基本初始化方式外,字符数组还可以使用字符串常量初始化。
      char a[5]={'a','b','c','d','e'};
      char a[]={'a','b','c','d','e'};

      把一个字符串存入一个数组时,也会将结束符'\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。

      用字符串方式赋值比用字符逐个赋值要多占1个字节,用于存放字符串结束标志'\0'。以下三种初始化的效果是一样的:

      char b[]={"How are you"};
      char b[]="How are you";
      char b[]={'H','o','w',' ','a','r','e',' ','y','o','u','\0'};

      同时,需要注意:字符数组可以使用在定义初始化的时候用字符串初始化,但是不能使用赋值语句整体赋值:

      char c[11] = "How are you";            /* 正确 */
      char c[11];
      c = "How are you";            /* 错误 */

      为了证实'\0'的存在,例如:

      #include<stdio.h>
      
      int main()
      {
      	int i;
      	char c[] = "How are you!";
      
      	for (i = 0;; i++) {
      		if (c[i] == '\0')
      			break;
      	}
      	printf("%d\n", i);
      
      	return 0;
      }

      最终结果输出12,代表字符数组下标为12的字符是'\0',这与我们的理论是一致的。

      字符串和字符数组

      C语言中没有专门的字符串变量,如果要将一个字符串存放到某一个变量中,必须使用字符数组,即用一个字符数组来存放一个字符串,数组中每个元素存放一个字符。

      • 字符串:必须以'\0'结尾;
      • 字符数组:可以包含多个'\0',也可以不包含'\0'。

      字符串的处理函数

      在采用字符串方式后,字符数组的输入/输出变得更加简单方便。除了可以使用字符串对字符数组赋初值的方法外,还可以用printf()函数和scanf_s()函数一次性输入/输出一个字符数组的所有字符,而不必利用循环单个操作。

      C语言提供了大量的字符串处理函数,大致可以分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。

      在使用输入/输出的字符串函数之前,需要包含头文件stdio.h;使用其他字符串函数之前,需要包含头文件string.h;

      由于没有字符串变量这个说法,所以对任何字符串的操作都是将它放在字符数组里。

      • 字符串输入函数gets()

      从键盘上输入一个字符串(包括空格),赋予从字符数组起始的存储单元,直到读入一个回车符为止。回车符读入后,不作为字符串的内容,系统将自动用'\0'替换,作为字符串结束的标志。

      char c[20];
      gets(c);
      • 字符串输出函数puts()

      将字符数组起始地址开始的第一个字符串(以'\0'结束的字符序列)输出到显示器,并将字符串结束标志'\0'自动转换成'\n'。

      char c[]="Hello!";
      puts(c);

      区分printf()与puts()、scanf_s()与gets()函数的区别:

      1. puts()函数在遇到'\0'时,会自动转换成'\n'。而printf()函数则不输出'\0',同时也不输出'\n';
      2. gets()函数接受字符串,读入换行符才停止。而scanf_s()函数则读入到空格或者换行符就停止。
      • 字符串长度函数strlen()

      测试字符数组起始地址开始的字符串(以'\0'结束的字符序列)有效长度,此长度不包括'\0'在内。

      char c[]="Hello";
      printf("%d",strlen(c));
      • 字符串连接函数strcat()
      strcat(字符数组1,字符数组2);

      将字符数组2连接到字符数组1之后,函数值为字符数组1的起始地址。连接字符数组1和字符数组2的尾部都有一个'\0',连接时将字符数组1后的'\0'自动取消,字符数组2后的'\0'一并连接到字符数组1后。

      这里还有一个注意点:

      #include<stdio.h>
      
      int main()
      {
      	char c1[20] = "Hello ";        /* 这里必须要指定足够的长度,否则会报错! */
      	char c2[] = "World!";
      	printf("%s", strcat(c1, c2));
      
      	return 0;
      }

      字符数组1必须要足够长度,以便在其有效字符后能够容纳字符数组2的字符串。

      • 字符串复制函数strcpy()
      strcpy(字符数组1,字符数组2);

      将字符数组2复制到字符数组1中去,函数值为字符数组1的起始地址。字符数组1的长度能够容纳字符数组2的长度;将字符数组2的字符串结束标志'\0'一起复制到字符数组1中去了;同时,strcpy()函数能够将字符数组2前面若干个字符复制到字符数组1中,例如:

      strcpy(字符数组1,字符数组2,长度);
      • 字符串比较函数strcmp()
      strcmp(字符数组1,字符数组2);

      将两个字符数组自左向右对应的字符逐个进行比较(按照ASCII码值大小比较),直到出现不同的字符或者遇到'\0'字符为止,函数值为一个整型。具体返回的情况如下表所示:

      strcmp函数返回值
      字符串大小情况返回值
      字符串1等于字符串20
      字符串1大于字符串21
      字符串1小于字符串2-1

       

      关于数组的小例子

      1、杨辉三角形:

      #include<stdio.h>
      
      int main()
      {
      	int a[10][10],i,j;
      	for (i = 0; i < 10; i++) {
      		a[i][0] = 1;
      		a[i][i] = 1;
      	}
      	for (i = 2; i < 10; i++) {
      		for (j = 1; j < i; j++) {
      			a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
      		}
      	}
      	for (i = 0; i < 10; i++) {
      		for (j = 0; j < i+1; j++) {
      			printf("%d ", a[i][j]);
      		}
      		printf("\n");
      	}
      
      	return 0;
      }

      这段程序的运行结果为:

      1
      1 1
      1 2 1
      1 3 3 1
      1 4 6 4 1
      1 5 10 10 5 1
      1 6 15 20 15 6 1
      1 7 21 35 35 21 7 1
      1 8 28 56 70 56 28 8 1
      1 9 36 84 126 126 84 36 9 1
      请按任意键继续. . .

      2、找出下面程序中的错误:

      #include<stdio.h>
      
      int main()
      {
      	unsigned char a[256], i;
      	for (i = 0; i < 256; i++) {
      		a[i] = i;
      	}
      
      	return 0;
      }

      unsigned char的取值范围为0-255,当i最大为255的时候,下次循环i++,i就变成了0,造成无限循环。

       

      展开全文
    • XShell鼠标选中, 实现快捷复制和粘贴

      万次阅读 多人点赞 2017-03-24 11:33:41
      Xshell鼠标实现快捷复制和粘贴, 增加Ctrl+v粘贴快捷键.

      以前用Putty, 里面有选中后, 点击鼠标右键快速粘贴的功能, 用Xshell后发现默认没有这个设置. 但是Xshell因为界面漂亮得多,功能也丰富得多,  并且一直在更新维护, 所以还是喜欢用它. 一次在视频课程上, 看到老师用XShell也实现了和Putty上的功能, 求助度娘, 找到了这个被隐藏起来的好用的功能.


      1. 鼠标选中, 点击鼠标右键快速粘贴:

      工具 --> 选项


      键盘和鼠标 --> 鼠标中, 将向右按钮定义为"粘贴剪切板内容", 中间按钮可以改为"打开菜单", 然后记得勾选"将选定的文本自动复制到剪切板".


      如此, 就实现了鼠标选中复制, 点击右键粘贴的便捷功能.


      2. 添加Ctrl + V快捷键, 实现粘贴, 这算是锦上添花吧.

      依然是上面的菜单, 编辑 --> 新建



      弹出的框中不支持字符输入, 是直接识别快捷键的, 按住Ctrl + V, 弹出后续菜单: 类型选择"菜单", 操作选择"粘贴"



      如此确定, 就实现了复制的内容Ctrl +V粘贴的功能了.

      展开全文
    • plsql将复制的文本格式化为in('A','B')格式 比如你复制了 10011272 10004335 10010907 10019194 10016917 10002325 10000025 10011272 10010974 10011574 点击ExPaste ('10011272','10004335','10010907','...
    • Python字符串详细介绍

      2020-12-25 11:31:57
      其中三引号可以由多行组成,编写多行文本的快捷语法,常用语文档字符串,在文件的特定地点,被当做注释。便捷的多行注释 Python实际三类字符串: 1.通常意义字符串(str) 2.原始字符串,以大写R 或 小写r开始,r”,...
    • python字符串操作

      千次阅读 2013-07-22 21:17:32
      其中三引号可以由多行组成,编写多行文本的快捷语法,常用语文档字符串,在文件的特定地点,被当做注释。便捷的多行注释 Python实际三类字符串: 1.通常意义字符串(str) 2.原始字符串,以大写R 或 小写r开始,r''
    • 当我们复制一个文件时用复制粘贴就可以了,如果是多个文件呢?就会很麻烦了,今天给大家介绍一下用Python批量复制文件,方法有九种!希望对你有帮助 1. Shutil Copyfile()方法 该方法只有在目标可写时才将源的...
    • java中转json字符串 ... 这是在Java中测试和学习解析JSON字符串的快方法,但是这种方法的主要问题是JSON字符串还包含双引号“”,该双引号也用于将Java 字符串文字包含在内。 由于JSON字符串本身包含双引号,...
    • 问题:输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。 输入格式: 输入在2行中分别给出不超过80个字符长度的、以回车结束的2个非空字符串,对应S1和S2。 输出格式: 在一行...
    • 快速批量复制文件名(任何格式均有效)

      万次阅读 热门讨论 2017-12-25 15:16:15
      快速批量复制文件名(任何格式均有效) 第一种 使用WinRAR批量复制文件名 1.1 打开WinRAR。随便打开一个压缩文件,然后向上返回即可;或双击打开WinRAR.exe。 2. 2 在WinRAR的资源...
    • java中的字符串和字符串常量池

      千次阅读 2019-03-24 13:31:23
      String作为一种被Final修饰并按照不可变性设计的类,应当说某种程度上语言本身是希望开发者把它当做基本数据类型去使用的,然而...java本身又提供了一些构建和操作字符串的快捷或隐秘的方式,使用不当往往产生很多不...
    • 你想复制其中几段文字到word里面却发现经常出现各式各样格式混乱的问题。比如原来首行有缩进2个字符的现在都是清一色的顶格,而且都不能占满全行,字体和大小也变了。每次都老老实实的手动修改,花费时间和精力,...
    • ES6简单的深复制方法

      万次阅读 2018-06-11 17:17:48
      我们看一下这个例子:[javascript] view plain copylet a={tile:'深复制'}; let b=a; a.title='浅复制'; 那么我们会获得两个对象,一个a,一个b,a的title是浅复制,b的title是深复制。但结果真是这样吗?...
    • pycharm对字符串进行正则替换

      千次阅读 2018-11-07 18:27:34
      利用Pycharm的替换功能,对字符串进行格式化的操作,例如,将浏览器中复制过来的requests headers 字符串通过替换格式化成一个字典。 工具/原料 pycharm 正则表达式 方法/步骤 首先,复制所有...
    • Windows核心编程之 2 字符字符

      千次阅读 2013-08-09 12:21:12
      1 包含新的安全是字符串处理头文件 StrSafe.h __counof 宏可以计算缓冲区的元素个数 StringCchCat StringCchCopy StringCchPrintf "Cch" 表示 字符数 StringCbCat StringCbCopy StringCbPrintf "cb" 表示...
    • python 字符串操作方法详解

      千次阅读 2019-04-23 15:47:37
      其中三引号可以由多行组成,编写多行文本的快捷语法,常用文档字符串,在文件的特定地点,被当做注释。便捷的多行注释。 Python实际三类字符串:  1.通常意义字符串(str)  2.原始字符串,以大写R 或 小写r开始...
    • 有时候我们会遇到这样一种情况:一些字符串资源要从原始项目A移植到现在我们开发的项目B中比如移植app名字Calendar我们需要做的是:在新项目对应的语言资源中查找是否有app_label这个资源。 有:则查看新旧资源是否...
    • VIM 快捷操作

      千次阅读 2020-02-03 16:06:02
      VIM 快捷操作
    • 今天在使用IntelliJ IDEA查找匹配两个字符中间的任意内容,以前没用过正则表达式,后来在网上找到了,记录一下。匹配两个字符串A与B中间的字符串包含A与B: 表达式:A.*?B(“.“表示任意字符,“?”表示匹配0个或多...
    • JVM常量池及字符串==比较分析

      千次阅读 2017-03-02 16:51:58
      Java常量池技术java中的常量池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复创建相等变量时节省了很多时间。常量池其实也就是一...
    • jtds,mysql,oracle,sqlserver数据库驱动与连接字符串,方便快捷,直接复制即可。
    • 以前都是自己按照json的格式来手动写,到现在才知道go有这么方便的方式,记下来哟。 Github提供了比较号的处理方式 https://mholt.github.io/json-to-go/ 效果图 使用方式 把Json的字符串放到左边,右边自动...
    • C++中,有两种类型的字符串表示形式: C-风格字符串 ...1 strcpy(s1,s2) 复制字符串 s2 到字符串 s1 2 strcat(s1,s2) 连接字符串 s2 到字符串 s1 的末尾 3 strlen(s1) 返回字符串 s1 的长度 4 strc...
    • python 中 u 和 r 加字符

      千次阅读 2014-12-17 14:17:34
      其中三引号可以由多行组成,编写多行文本的快捷语法,常用语文档字符串,在文件的特定地点,被当做注释。便捷的多行注释 Python实际三类字符串: 1.通常意义字符串(str) 2.原始字符串,以大写R 或
    • 在使用matlab写代码的过程中有很多的.m文件作为函数被调用,如果是使用VS自然...只要将函数名作为需要搜索的字符串就可以很快查到函数在哪个.m文件中被调用,方便快捷,后来结合了office转txt的功能,实现了扩展到进
    • Java字符串String类操作方法整理

      万次阅读 多人点赞 2018-04-28 01:06:48
      最近利用晚上的一些空闲时间学习了Java的字符串部分,发现其与C语言、C++等面向过程语言在使用上出现的不同点,C语言仅仅提供了字符串类型的一个构造,相当于只给了开发者基本材料,让开发者自行去用材料造轮子;...

    空空如也

    空空如也

    1 2 3 4 5 ... 20
    收藏数 63,099
    精华内容 25,239
    关键字:

    复制字符格式最快捷