精华内容
下载资源
问答
  • 上面是定义了一个字符串数组及一个指向这个字符串数组的指针,可以通过这个指针对数组中的内容进行操作; 例如:*(pstr + i) = ‘a’; 但是下面的情况不可以直接对数组进行操作: char *str = “1234567...

    区别:数组形字符串存放在全局数据区或栈区,可读可写。指针字符串存放在常量区,只读不能写。

    char str[] = “max666”;
    char * pstr = str;
    上面是定义了一个字符串数组及一个指向这个字符串数组的指针,可以通过这个指针对数组中的内容进行操作;
    例如:*(pstr + i) = ‘a’;
    但是下面的情况不可以直接对数组进行操作:

    char *str = “1234567asdf”;
    这种情况下,指针指向的内容是一个字符串常量,常量是不允许被修改的,所以不可以通过这个指针对字符串进行修改的操作;
    即 : *(str + i) = ‘a’; 是非法的;

    展开全文
  • 预备知识:变量在内存的不同区域介绍C语言中,字符数组字符串指针都可以用来存储字符串:char *pstr = "china";char str[] = "china";但两者在内存中的存储区域是不一样的:字符指针的字符串存储在常量区;而字符...

    预备知识:变量在内存的不同区域介绍

    C语言中,字符数组和字符串指针都可以用来存储字符串:

    char *pstr = "china";

    char str[] = "china";

    但两者在内存中的存储区域是不一样的:

    • 字符指针的字符串存储在常量区;
    • 而字符数组则存储在栈区。

    如下图所示,字符指针pstr指向字符串"china"常量的首地址,字符数组str指向的是在栈区的地址。

    021b5ca61c1652de796f565e6541ea7c.png

    栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。因此,带来两方面的区别。

    1、指向内容的可变性

    字符串一旦被创建就存在于常量池中。

    char *pstr = "china";

    这是对字符指针进行初始化,此时字符指针指向一个字符串常量的首地址,常量是不能改变的。

    char str[] = "china";

    这是以字符数组形式创建的字符串,实际上是从字符串常量池中复制了一个副本,所以修改字符数组的内容时,只是修改的自己的副本,并不会影响到常量池中的字符串。

    下面代码直接修改 pstr[0] 的值是错误的(能够正常编译和链接,但在运行时会出现段错误(Segment Fault)或者写入位置错误);而修改 str[0] 的值则是可以的。

    717918a376cec42eefbbbec632cd557b.png

    2、值的可变性

    pstr 和 str 都是指针,但 pstr 是个变量,它的值是可以改变的,比如可以指向另一个字符串;而 str 指向的是本数组的首元素的地址,不能再变。

    2da59e3c027f1ea300a3b0e4c0bbdfce.png

    总结一下,C语言有两种表示字符串的方法:一种是字符数组,另一种是字符串常量,它们在内存中的存储位置不同,使得字符数组可以读取和修改,而字符串常量只能读取不能修改。

    值的可变性:

    • 指针变量的值(pstr)是可以改变的,就是地址的改变;
    • 数组名的值(str)是不能改变的,它只能指向本数组的首元素地址。

    指向的内容值:

    • 字符指针数组内的元素的值是常量,在内存的常量区,不能发生改变;
    • 字符数组内的元素是变量,在内存的栈区,是可以改变的。

    在编程时,若只需要到对字符串的读取,那么字符数组和字符串常量都能满足要求;若有写入(修改)操作,则只能使用字符数组,不能使用字符串常量。

    ef1a73fdc8407417d0f7f955323edefd.png
    展开全文
  • C语言字符串数组

    2019-09-11 23:33:11
    1、字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。char str[10]={ 'I',' ','a','m',' ',‘h','a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中...

    1、字符数组的定义与初始化
    字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。
    char str[10]={ 'I',' ','a','m',' ',‘h','a','p','p','y'};
    即把10个字符分别赋给str[0]到str[9]10个元素
    如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' )。

    2、字符数组与字符串
    在c语言中,将字符串作为字符数组来处理。(c++中不是)
    在实际应用中人们关心的是有效字符串的长度而不是字符数组的长度,例如,定义一个字符数组长度为100,而实际有效字符只有40个,为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符'\0'代表。如果有一个字符串,其中第10个字符为'\0',则此字符串的有效字符为9个。也就是说,在遇到第一个字符'\0'时,表示字符串结束,由它前面的字符组成字符串。
    系统对字符串常量也自动加一个'\0'作为结束符。例如"C Program”共有9个字符,但在内存中占10个字节,最后一个字节'\0'是系统自动加上的。(通过sizeof()函数可验证)
    有了结束标志'\0'后,字符数组的长度就显得不那么重要了,在程序中往往依靠检测'\0'的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。当然,在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度。(在实际字符串定义中,常常并不指定数组长度,如char str[ ])
    说明:'\n'代表ASCII码为0的字符,从ASCII码表中可以查到ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不干。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。
    对C语言处理字符串的方法由以上的了解后,再对字符数组初始化的方法补充一种方法――即可以用字符串常量来初始化字符数组:
    char str[ ]={"I am happy"};       可以省略花括号,如下所示
    char str[ ]="I am happy";
    注意:上述这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,下面的赋值方法是错误的
                 char str[ ];
                str="I am happy";

    不是用单个字符作为初值,而是用一个字符串(注意:字符串的两端是用双引号“”而不是单引号‘'括起来的)作为初值。显然,这种方法更直观方便。(注意:数组str的长度不是10,而是11,这点请务必记住,因为字符串常量"I am happy"的最后由系统自动加上一个'\0')
    因此,上面的初始化与下面的初始化等价
    char str[ ]={'I',' ','a','m',' ','h','a','p','p','y','\0'};
    而不与下面的等价
    char str[ ]={'I',' ','a','m',' ','h','a','p','p','y'};
    前者的长度是11,后者的长度是10.
    说明:字符数组并不要求它的最后一个字符为'\0',甚至可以不包含'\0',向下面这样写是完全合法的。
    char str[5]={'C','h','i','n','a'};
    ++++++++
    可见,用两种不同方法初始化字符数组后得到的数组长度是不同的。

    #include <stdio.h>
    void main(void)
    {
    char c1[]={'I',' ','a','m',' ','h','a','p','p','y'};
    char c2[]="I am happy";
    int i1=sizeof(c1);
    int i2=sizeof(c2);
    printf("%d\n",i1);
    printf("%d\n",i2);
    }
    结果:10   11

    3、字符串的表示形式
    在C语言中,可以用两种方法表示和存放字符串:
    (1)用字符数组存放一个字符串
              char str[ ]="I love China";
    (2)用字符指针指向一个字符串
              char* str="I love China";
    对于第二种表示方法,有人认为str是一个字符串变量,以为定义时把字符串常量"I love China"直接赋给该字符串变量,这是不对的。
    C语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来存放字符串常量,程序在定义字符串指针变量str时只是把字符串首地址(即存放字符串的字符数组的首地址)赋给str。
    两种表示方式的字符串输出都用
    printf("%s\n",str);
    %s表示输出一个字符串,给出字符指针变量名str(对于第一种表示方法,字符数组名即是字符数组的首地址,与第二种中的指针意义是一致的),则系统先输出它所指向的一个字符数据,然后自动使str自动加1,使之指向下一个字符...,如此,直到遇到字符串结束标识符 " \0 "。

    4、对使用字符指针变量和字符数组两种方法表示字符串的讨论
    虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈。
    4.1、字符数组由若干个元素组成,每个元素放一个字符;而字符指针变量中存放的是地址(字符串/字符数组的首地址),绝不是将字符串放到字符指针变量中(是字符串首地址)
    4.2、赋值方式:
         对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值
         char str[14];
         str="I love China";     (但在字符数组初始化时可以,即char str[14]="I love China";)
         而对字符指针变量,采用下面方法赋值:
         char* a;
         a="I love China";
         或者是 char* a="I love China";       都可以
    4.3、对字符指针变量赋初值(初始化):
             char* a="I love China";     
    等价于:
               char* a;
               a="I love China";
    而对于字符数组的初始化
              char str[14]="I love China";
    不能等价于:
             char str[14];
             str="I love China"; (这种不是初始化,而是赋值,而对数组这样赋值是不对的)
    4.4、如果定义了一个字符数组,那么它有确定的内存地址;而定义一个字符指针变量时,它并未指向某个确定的字符数据,并且可以多次赋值。

    5、字符串处理函数
    5.1
    char *strcat(char *str1,const char *2 );
    char *strcat(char *strDestination,const char *strSource );
    功能:函数将字符串str2 连接到str1的末端,并返回指针str1
    注:连接前两个字符串的后面都有一个' \0 ',连接时将字符串1后面的 ' \0 ‘去掉,只在新串最后保留一个 ' \0 ‘
    5.2
    char *strcpy(char *str1,const char *2 );
    char *strcpy(char *strDestination,const char *strSource );
    功能:复制字符串strSource中的字符到字符串strDestination,包括空值结束符。返回值为指针strDestination。
    注:1、“字符数组1”必须写成数组名形式,“字符串2"可以是字符数组名,也可以是一个字符串常量
    2、复制时连同字符串后面的 ' \0 ' 一起复制到数组1中
    3、不能用赋值语句直接将一个字符串常量或者字符数组直接赋给一个字符数组(同普通变量数组是一样的),而只能用strcpy函数处理。
    4、可以用strcpy函数将字符串2中的前若干个字符复制到字符数组1中去。


    本文出自 “大李子” 博客,谢绝转载!

    转载于:https://my.oschina.net/u/3579120/blog/1508072

    展开全文
  • printf("元素数组 -> 拷贝后的数组 \n"); for(loop = 0; loop (original); loop++) { printf(" %2d %2d\n", original[loop], copiedOne[loop]); } ArrayCopy(original,copiedTwo, Length); copiedTwo[9] = 20; ...

    值传递与地址传递的区别:

    #include "stdio.h"

    int ArrayCopy(char* ori, char* cop, char Length)

    {

    char loop;

    for(loop = 0; loop < Length; loop++)

    {

    *cop++ = *ori++;

    }

    return 0;

    }

    int main()

    {

    char original[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};

    char *copiedOne=original;

    char copiedTwo[10];

    char loop;

    char Length;

    Length = sizeof(original);

    printf("元素数组 -> 拷贝后的数组 \n");

    for(loop = 0; loop < sizeof(original); loop++)

    {

    printf(" %2d %2d\n", original[loop], copiedOne[loop]);

    }

    ArrayCopy(original,copiedTwo, Length);

    copiedTwo[9] = 20;

    printf("值传递:\n");

    printf("值传递更改数据后,只有拷贝的数组中的元素被更改: \n");

    printf("元素数组 -> 拷贝后的数组 \n");

    for(loop = 0; loop < sizeof(original); loop++)

    {

    printf(" %2d %2d\n", original[loop], copiedTwo[loop]);

    }

    copiedOne[9] = 50;

    printf("地址传递:\n");

    printf("地址传递更改数据后,原数组元素与拷贝的数组中的元素同时被更改: \n");

    printf("元素数组 -> 拷贝后的数组 \n");

    for(loop = 0; loop < sizeof(original); loop++)

    {

    printf(" %2d %2d\n", original[loop], copiedOne[loop]);

    }

    return 0;

    }

    AsSaSsIn

    AsSaSsIn

    943***763@qq.com2年前 (2019-02-24)

    展开全文
  • 1.字符数组初始化在C语言中,字符串是当做字符数组来处理的;所以字符串有两种声明方式,一种是字符数组,一种是字符指针。(1)直接逐个初始化字符数组:字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各...
  • 前几天帮别人解决数组拼接问题(类似字符串拼接)时想到这个专题。因为她的代码太糟糕。我们知道C、C++中的数组是没有拷贝(复制)运算的,除非编译器支持。因为C语言发明的初衷是替换汇编语言,要知道你用不同指令集的...
  • 我们将使用两个数组,然后基于一些约束条件,将其内容复制到一个单个数组中。 在这个例子中,我们将使用两个数组,一个将存储偶数值,另一个将存储奇数值。实现实现合列数组的代码如下 -#include int main() {int ...
  • C语言字符串数组的使用

    千次阅读 2014-01-13 12:03:59
    1、字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。 char str[10]={ 'I',' ','a','m',' ',‘h','a','p','p','y'}; 即把10个字符分别赋给str[0]到str[9]10个元素 如果...
  • 字符串数组字符串数组内内没有‘\0’,用%s输出时,系统会一直找到‘\0’为止。即使超出数组的范围也一直找。 char c[] = “I am happy”; //字符串,长度为11 char c[] = {‘I’, 使用strcat、strcpy,strcmp...
  • C语言字符串数组的例题

    千次阅读 2013-03-12 18:56:27
    (1)从键盘上接收一个字符串,保存到一个字符数组中。 (2)然后从后面往前倒序输出这个字符串。例如:接收字符串为:“Jone”,则输出结果为“enoJ”。 #include #include #include int main() { ...
  • 复制代码 代码如下:char finalPathSet[256][256];char middlePathSet[256][256];int finalSetSize=0;int middleSetSize=0;int addToPathSet(char path[]){strcpy(middlePathSet[middleSetSize],path);middleSetSize+...
  • 目录数组字符串数组概念数组是有序数据的集合。数组中的每个元素属于同一个数据类型。经过数组名和下标惟一肯定数组中的元素。一维数组的定义语法格式数组数据类型 数组名[常量表达式]函数例如:int arr[10]spa表示...
  • 功 能: 拷贝一个字符串到另一个字符串数组中参数: char *destin 为复制的目标字符串数组const char *source 为复制的源字符串数组返回值: 返回指向目标字符串数组的指针注意:必须保证destin 足够大,能够容纳下 ...
  • c语言字符串数组

    2019-11-27 16:59:57
    一、字符串与字符串数组 1、字符数组的定义 char array[100]; 2、字符数组初始化 char array[100] = {‘a’,‘b’,‘c’}; //array[0] = ‘a’ array[10] = 0 char aray[100] = “abcdef”; char aray[100] = {0}; ...
  • 首先介绍一下c语言吧,C 语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言。这是一门基础简单强大的语言,linux操作系统...
  • 如何将一个字符串数组赋值给另一个字符串数组?一开始直接用二维数组赋值,报错了,那么怎么用一个字符串数组初始化另一个字符串数组
  • c语言字符数组字符串应用方法是什么?c语言字符数组字符串应用方法:1、字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。char str[10]={ 'I',' ','a','m',' ',‘h','a'...
  • C语言字符串数组

    千次阅读 2018-05-14 14:34:10
    1、字符串数组复制(不使用库函数)/* 在不使用指针和库函数的 条件下 将str1复制到str2当去 */ #include&lt;stdio.h&gt; int main(void){ //数组定义 char str1[50] = "hellobeijin"...
  • 1. 字符串数组与字符串的区别 在定义字符串的时候,比如通过如下方式 //方式1 char str1[] = "Hello world!"; 编译器实际上是做了两件事: - 定义了一个字符串常量"Hello world!",并将他放在静态存储区,并且...
  • 1.C语言数组的概念在《更加优美的C语言输出》一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下:#include <stdio.h>#include <stdlib.h>int main(){ int a1=20, a2=345, a3=700, a4=22; ...
  • 1、字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。 char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'}; 即把10个字符分别赋给str[0]到str[9]10个元素 ...
  • 二维字符数组中为什么定义字符串是一行一个?“hello world”在C语言中代表什么?为什么只能在定义时才能写成char a[10]="jvssj";在函数体里就不可以这样赋值了,只能调用库里的函数 strcpy(a,"jvssj"),究竟是为...
  • C语言 | 字符数组

    千次阅读 2021-04-12 09:45:02
    C语言字符数组的定义 字符数组是用来存放字符数据的数组,字符数组中的一个元素存放一个字符,定义字符数组的方法和定义数值型数组的方法类似。 //例子: char character[10]; C语言字符数组的初始化 C语言对字符...
  • C语言基础不行,如果有错请大牛指出,让小弟深入学习 ... //如果想将另一个数组复制到这个数组 这个数组必须要有空间存储它才行 //在用VC6.0时不知道为什么不用写数组长度就可以成功,而keil
  • 1:概念 用来存放字符的数组成为字符数组。...【注意】在C语言中没有字符串,所以用字符数组来存放字符串。 例如: char a[30]={"shisihuansheng.blog"}; char a[30]="shisihuansheng.blog";//这个写法更为...
  • 主要内容:字符串数组内存分配细节‘\0’空字符、字符串数组赋值细节、字符串换行连接和下标 #include #include #define STR_LEN 80 char str[STR_LEN+1]; // 用来储存字符串最多80个字符,则要多分配一个空间...
  • C语言中字符数组的初始化与赋值,字符串相关函数! 1.字符数组初始化 在C语言中,字符串是当做字符数组来处理的;所以字符串有两种声明方式,一种是字符数组,一种是字符指针。 (1)直接逐个初始化字符数组:...
  • c 字符串数组 复制操作

    千次阅读 2018-06-09 16:18:56
    #include &lt;iostream&gt; #include &lt;stdio.h&gt; #define MAX_BUF_SIZE 1000 .../***********************字符串复制**************************************/ char buf[MAX_B...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,815
精华内容 19,126
关键字:

c语言字符串数组复制

c语言 订阅