精华内容
下载资源
问答
  • C语言字符串数组

    2019-09-11 23:32:29
    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/1508063

    展开全文
  • c语言字符串数组的两种表示方法

    千次阅读 2017-09-21 00:31:56
    c语言字符串数组的两种表示方法

    字符串数组
    1. 定义

      字符串数组:一个数组中的所有的元素都是字符串。  

      如果想存储一堆字符串那么可以使用字符串数组,说白了字符串数组就是二维数组

      字符串数组两种表示:

    第一种:char strr[4][6] = {"aaa", "bbb", "ccc"}; //char类型的二维数组
    第二种:char *str[4] = {"aaa", "bbb", "ccc"}; //char*类型的一维数组
    

    这里解析一下第二种表示方法:str是一个一维数组,而且数组里面的每一个元素都是一个char类型值的地址。第一个指针是str[0],它指向第一个字符串的第一个字符。第二个指针是str[1],它指向第二个字符串的第一个字符。即一般地每一个指针指向相应字符串的的第一个字符:

    *str[0]=='a',*str[1]=='b',*str[2]=='c'

    以此类推,str数组实际上并不存放字符串,它只是存放字符串的地址(字符串存在程序用来存放常量的那部分内存中)。可以把str[0]看作第一个字符串。由于数组符号与指针的关系,也可以用str[0][0]来表示第一个字符串中的第一个字符,尽管str没有被定义为二维数组。

    示例如下:

    这里写图片描述

    这里写图片描述

    展开全文
  • C语言字符串数组的小坑解释 有这么一段C语言代码: #include <stdio.h> #include <string.h> using namespace std; struct student{ char num[3]; char name[20]; char sex; int age; }students...

    C语言字符串数组的小坑


    有这么一段C语言代码:

    #include <stdio.h>
    #include <string.h>
    
    using namespace std;
    
    struct student{
        char num[3];
        char name[20];
        char sex;
        int age;
    }students[1000];
    
    int main()
    {
        int n, m, x;
        while(scanf("%d", &n)!=EOF){
            for(int i=0; i<n; i++){
                scanf("%s", students[i].num);
                getchar();
                scanf("%s", students[i].name);
                getchar();
                scanf("%c", &students[i].sex);
                scanf("%d", &students[i].age);
                printf("--\n%s\n%s\n%c\n%d\n--", students[i].num, students[i].name, students[i].sex, students[i].age);
            }
            printf("over");
    
        }
        return 0;
    }
    
    

    在我进行测试的时候,出现了下面的结果
    代码执行截图
    是不是很奇怪,我在输出num的时候时001ssr
    所以是为什么呢?

    解释

    C语言将数组作为字符串存储时,最后一位默认是’\0‘,标志着字符串的结束。
    所以比如我们将abc这三个字母存入字符串数组时,它实际占用了四个位置。
    在上面的代码中,因为我定义了num[3],所以在读入时001分别占据了num[0] num[1] num[2],也就意味着结尾处没有’\0‘标记,又由于系统在分配内存空间时是连续的,所有下一位就存储了name[0] = s,在进行输出num的时候当输出完001此时并没有碰到字符串的结束符,所以会继续向下,输出ssr,因为name数组的空间足够大,所以在输出num[2] = r时,碰到了name[3] = '\0',此时代表着字符串的结束。
    这也就是出现上面错误的原因了。
    所以在预设的时候,一定要记得数组要适当的大一点

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

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

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

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

    展开全文
  • C语言字符串数组遍历处理

    千次阅读 2019-01-09 16:21:00
    int main() { char *str_char[] = {"POrigin", "PModelNum", "PName", "PSN", "PDate", "PAddress", "PHWVer", "PSWVer", "PSWDate", ... 定义字符串数组, 为一个二维数组,这里的ULL为字符串数组结束标志*/ c...
  • 1.字符串数组的定义 char *str[] = { }; 每个元素都是指针,指向存储空间中的某个字符串 取其中的值的时候直接用str[i]来取 //上面的内容使用注释的话就看不清字了 2.输入的思路 定义字符串数组长度(这个没办法...
  • C语言字符串数组赋值

    千次阅读 2019-09-13 21:16:15
    数组赋值有两种方式 一种是在定义是赋值: char book[] = {"the story of ...定义后在赋值就一般用strcpy,不能用=赋值,C语言并没有提供可以直接操作字符串的运算符;“=”可以用于其他数据类型的赋值,但是不可以...
  • 字符串数组与字符串指针在使用上有很多相似的地方,导致对两者的理解容易混淆.下面我们将从汇编的角度来详细审视一下两者的区别.
  • C语言字符串数组拼接

    2021-03-26 22:13:15
    /** * @brief 字符串拼接[1,2,3] * @param *fileName 目标字符串 * @param *str 待拼接字符串 * @param End_Flag 1:开始标识,2.结束标识,0:默认 * @return {0} */ int stringJoint(char *fileName, char *str, char...
  •   创建一个字符数组很方便,可以通过数组下标访问多个不同的字符串,创建字符串数组既可以通过Char数组创建,也可以通过指向字符串的指针数组创建....
  • //C语言学习路线//好的学习路线图会为你指明学习方向,帮助你更好的把握整体的学习节奏,同时也避免浪费大量时间在学习一些不太可能会用到的东西上,另外你也可以参照C语言学习路线图实时把控自己的学习进度。...
  • 字符串数组字符串数组内内没有‘\0’,用%s输出时,系统会一直找到‘\0’为止。即使超出数组的范围也一直找。 char c[] = “I am happy”; //字符串,长度为11 char c[] = {‘I’, 使用strcat、strcpy,strcmp...
  • 各位好,我最近在学习C语言处理字符串的相关知识,有个问题一直没解决,下望各位帮我想一下解决方法。 文件lines.txt,里面有如下内容: ``` cat dog duck rabbit bird cow mouse snake ``` 每行两个...
  • 生成一个字符串数组,元素分别为"test1","test2""test3""test4".(用for循环,元素数量可变) 2.为什么我程序在把命令行传入的参数赋值给一个字符串变量后,其余的字符串变量都变成了这个参数值?比如: tx[0]="KU"; ...
  • 预备知识:变量在内存的不同区域介绍C语言中,字符数组字符串指针都可以用来存储字符串:char *pstr = "china";char str[] = "china";但两者在内存中的存储区域是不一样的:字符指针的字符串存储在常量区;而字符...
  • #include int main() { char *ptr[10]; 为什么这样运行时会出错? gets(ptr[0]); } #include int main() { char ptr[10][20]; 而这样运行时则没有问题? gets(ptr[0]); } char *p[10] 与 char p[10][20] 之间...
  • 如何实现strlen的功能呢 注意的几点: 如果知道数组的大小用for循环,不知道用while循环,每个字符串后边都有一个反斜杠0(\0),通过它我们可以判断数组的大下。 ...
  • [liuqiang@a2 string]$ cat stringTest.c #include<stdio.h> #include<string.h> int main() { char s[]="Njupt"; // s[2]=0; printf("%lu %s",strlen(s),s); return ...
  • 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个元素 如果...
  • C语言字符串数组的例题

    千次阅读 2013-03-12 18:56:27
    (1)从键盘上接收一个字符串,保存到一个字符数组中。 (2)然后从后面往前倒序输出这个字符串。例如:接收字符串为:“Jone”,则输出结果为“enoJ”。 #include #include #include int main() { ...
  • 我编写了一个打印字符串数组的函数,但是将字符串数组作为参数传入函数却无法打印,而设置一个指向字符串的指针数组传入函数就能打印了,这是为什么? #include <stdio.h> #include <string.h> #...
  • 1,字符数组中的特殊字符‘、'\0'的作用 char a[10] = {'i',' ','a','m',' ','c','h','i','n','a'}; char b[]="i am china"; printf("%d\n",strlen(a)); printf("%d\n",strlen(b)...
  • 关于C语言字符串数组

    千次阅读 2009-04-16 10:48:00
    sizeof()是编译时常量,也就是它的值在编译时就已经确定了,因此无论是否对字符串做了strcat(),sizeof(s)的值不变。 #include #include #include //output: //strlen=14, sizeof=15 //strlen=26, sizeof=15...
  • 文章目录C语言int型数组转化为char型字符串数组一、代码二、结果三、说明 C语言int型数组转化为char型字符串数组 一、代码 /* 程序功能: int型数组转化为char型字符串数组 */ #include &lt;stdio.h&...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,569
精华内容 4,227
关键字:

c语言字符串数组

c语言 订阅