精华内容
下载资源
问答
  • c语言字符串数组与字符串的区别,以及定义字符串的几种方式。
    千次阅读
    2020-08-24 12:40:54

    1. 字符串数组与字符串的区别

    定义字符串的时候,比如通过如下方式

    //方式1
    char str1[] = "Hello world!";

    编译器实际上是做了两件事:

    - 定义了一个字符串字面量"Hello world!",并将他放在静态存储区,并且在这个字符串末尾添加一个null ('\0')字符,表示这字符串结束。

    - 定义一个字符数组,在动态内存中为该数组开辟一块空间,将静态存储区的"Hello world!\0"(包含'\0')复制到字符数组。开辟空间的大小就是字符串长度加上末尾的null字符。这些都是编译器完成的。

    关于什么是静态内存区,什么是动态内存区,请参考其他文档。

     而定义字符串数组,则没有这样的过程。不存在静态内存中存储字符串常量和添加'\0'的过程。比如下边的程序:

    #include <stdio.h>
    #define MSG "Hello world!"
    
    int main(void)
    {
    
        //方式1
        char str1[] = MSG;
        char str2[] = {'H','e','l','l','o',' ', 'w', 'o','r','l','d','!'};
        printf("str1 is: %s, str1 size is: %zd\n",str1,sizeof(str1));
        printf("str2 is: %s, str2 size is: %zd\n",str2,sizeof(str2));
    
    }
    

     他的输出是:

    # ./a.out
    str1 is: Hello world!, str1 size is: 13
    str2 is: Hello world!, str2 size is: 12
    

     需要注意的是,即使是字符数组没有以'\0'结尾,仍然可以在printf中以%s的格式打印。这也体现了c语言的灵活性。

    Q:为什么编译器要将字符串字面量保存到静态存储区?

    A:假设一个大型程序,有多处需要执行命令打印某一个字符串,比如下边这样,不管在printf中是直接使用字面量字符串参数,还是通过指针的方式,如果编译器为每一处字面量的出现或者字符串指针的定义都开辟一块空间保存字符串"balabala",就会存在存储空间浪费。所以编译器在编译的时候,当遇到第一次出现字符串字面量时,就在静态存储区开辟一块儿空间保存他,而这之后的程序中再次使用同样的字面量字符串,都会将静态存储区的字面量字符串地址传过去。

    printf("%s","balabala");
    ...
    printf("%s","balabala");
    ...
    constant char * str1 = "balabala";
    printf("%s", str1);
    ...
    constant char * str2 = "balabala";
    printf("%s", str2);
    

    2. 字符串的定义主要有以下两种方式:

    //方式1
    char str1[] = "Hello world!";
    //方式2
    const char * str2 = "Hello world!";

    方式1:

    程序编译后,执行程序,首先完成加载程序,加载完成后,会在静态内存中开辟一块空间保存字符串常量"Hello world!"。

    当执行char str1[] = "Hello world!"; 语句后,会开辟一块新的内存空间,将静态内存区的"Hello world!"复制到新开辟的空间,并将新开辟空间的第一个字节的地址赋给str1变量。

    方式2:

    接着上边的执行流程,当const char * str2 = "Hello world!"; 执行后,保存字符串常量"Hello world!"的静态内存空间的首字节地址赋给str2。至于为什么该语句中一般要求使用const,就是因为一般我们不希望修改静态内存空间的字符串的值。比如下边的程序,会打印Segmentation fault 错误。

    #include <stdio.h>
    #define MSG "Hello world!"
    
    int main(void)
    {
        
        //方式2,但不适用const
        char * str2 = MSG;
    
        *(str2+1) = 'E';
        //方式1
        char str1[] = MSG;
        printf("%s",str1);
    
    }
    

    而下边的程序,就没有错误。会输出"HEllo world!"

    #include <stdio.h>
    #define MSG "Hello world!"
    
    int main(void)
    {
    
        //方式1
        char str1[] = MSG;
        //方式2,但不适用const
        char * str2 = str1;
        //printf("%c",*(str2+1));
        *(str2+1) = 'E';
        printf("%s",str2);
    
    }
    

     

    更多相关内容
  • C语言关于字符串数组定义

    千次阅读 2020-08-28 15:11:35
    第一种:使用二维数据来完成 void first_demo() { char str_list[3][10]={"zero","one","two"}; int i; for(i=0;i<3;i++) { printf("%s ",str_list[i]); } } 第二种:使用指针来完成 ... for(i=

    第一种:使用二维数据来完成

    void first_demo()
    {
        char str_list[3][10]={"zero","one","two"};
        int i;
        for(i=0;i<3;i++)
        {
            printf("%s ",str_list[i]);
        }
    }
    

    第二种:使用指针来完成

    void second_demo()
    {
        char *p[]={"zero","one","two"};
        int i;
        for(i=0;i<3;i++)
        {
            printf("%s ",p[i]);
        }
    }
    
    展开全文
  • C语言字符串数组与字符串指针数组

    万次阅读 多人点赞 2019-04-27 21:46:19
    1,首先,不论是局部,静态还是全局数组都必须在定义的时候...最开始编写时,将str定义字符串数组,怎么都出不来结果。半天才发现应该用字符串指针数组 3,那么问题来了,字符串数组和字符串指针数组有什么区别 ...

    1,首先,不论是局部,静态还是全局数组都必须在定义的时候初始化,否则就得通过其他方式,eg 循环操作,字符串处理函数strcpy()

    2,附以下代码: 主要完成将”I am from china ”倒置为”china from am I”,

    最开始编写时,将str定义为字符串数组,怎么都出不来结果。半天才发现应该用字符串指针数组

    3,那么问题来了,字符串数组和字符串指针数组有什么区别

    举个例子  char a[] = "hello";   //字符串数组,存放的是字符

                    char *b[] = {"hello", "world"};//字符串指针数组,存放的是指针即元素地址,指针指向其中的元素

    字符数组初始化  char a[10] ="hello";//字符串以'\0'结尾,这种方式系统会自动在数组未填值的地方添加'\0'

                               char b[] = {'h', 'e' , 'l', 'l', '\0'};//类似于初始化整型数组,必须要手动在后面添加'\0'

    所以当我 这样定义时char a[] = {"hello", "world"};,报错str中有多余的元素。

     

    详细说明:
         假定字符串数据中也以NUL结束字符串    

          char  arr1[10][100];

          char *arr2[10];

        内存: arr1是个字符串数组,分配内存 10 * 100 = 1000 个字节。
                  arr2是个字符串指针数组,分配内存 10 * 8 = 80 个字节。

      标识符: arr1是个该数组第一个指向 100 个char型数据内存的指针。
                    形象的理解,arr1是一篇文章(共10行)中的     第一行的首地址。
                    arr2是个该数组第一个指向  1  个char型数据(8字节)内存的指针。
                    形象的理解,arr2是一篇文章(共10行)中的第一行的     首字符地址。

    元素访问: 
            
            a.  arr1[4][0];
                 *arr2[4];
                它们都是用于表示访问各自数组中第4行的首字符。

            b.  arr1[4]
                 arr2[4]
                它们都是用于表达第4行字符串。
                arr1[4]是字符指针常量,arr2[4]是字符指针变量。

            c.  char (*parr1)[100];
                 char **parr2;
                 parr1 = arr1 + 4;
                 parr2 = arr2 + 4;
                定义了两个变量,分别接收了两个数组的第4行的数据。
                parr1是指向第4行拥有100个字符的一维数组。
                parr2定义一个指向第4列的一个指针。

            d.  char *str1, *str2, *str2, *str4;
                 str1 = arr1[4];
                 arr1[4]它就是arr1第4行这个有100个字符的一维数组名,是该数组首元素的指针常量。
                 str2 = *( arr1 + 4 )
                 arr1+4是指向arr1第4行字符的指针,进行间接访问后,得到第4行字符这个一维数组的数组名。
                 str3 = arr2[4];
                 arr2[4]是arr2的第4个元素,该元素是指向一个字符串的首元素指针。
                 str3 = *( arr2 + 4 )
                 arr2+4是指向arr2第4个元素的指针,进行间接访问后,得到第4个元素,该元素是一个指向一个字符串首元素的指针。

    字符串数组与字符串指针的共同点:
           arr1[4]、*( arr1 + 4 ) 字符指针常量。
           arr2[4]、*( arr2 + 4 ) 字符指针变量。
           它们都是字符指针,只不过一个可以修改指针值,一个不能修改指针值。
           指针变量需要初始化,指针常量在定义时已经完成了初始化。
           若字符串数组中的数据也以NUL结尾,那么这两种指针都可以用字符串标准库函数的实参(因为这些函数都不会改变指针值)。

     

    三种方法:

    1.在C语言中,是将字符串作为字符数组来处理的,字符串是逐个存放到数组元素中的,例如用一个一维的字符数组存放字符串"I am a boy.",如下代码:

    char c[12] = {'I','a','m','a','b','o','y','.'};
    这个字符串的实际长度是11,数组长度是12,实际工作中,人们关心的往往是字符串的有效长度而不是字符串的数组长度,例如要打印字符串,这是就要知道字符串的实际长度。平时常使用下面三种方式来测定字符串的实际长度:
    (1)在串值后面加一个不计入长度的结束标记字符,比如'\0'来表示串值的终结

    初始化一个字符串的方法如下,在最后添加'\0'

    char str[] = {'I','a','m','h','a','p','p','y','\0'};
    也可以直接使用字符串常量初始化字符数组(系统自动加上'\0'),这种方法符合人们的习惯。

    char str[] = "I am happy";
    或者
    char str[] = {"I am happy"};
    注意:不能使用下面的赋值方式:
    char str[20];
    str = "I am happy";
    但可以用字符指针指向这个字符串:
    char *str;
    str = "I love China";


    (2)将实际串长度值保存在数组0的下标下

    #define MAXSIZE 20                        //数组的长度
    typdef char String[MAXSIZE+1];
    初始化字符串的方法:

    String t;
    StrAssign(t,"I am happy");                
    int StrAssign(String T,char *chars)  
    {
        T[0] = strlen(chars);                //下标为0存放数组长度
        for(i=1;i<=strlen(chars);i++)        //下标位置从1开始存放数据
        {
            T[i] = *(chars+i-1);
        }
         return 1;
    }
    (3)使用结构体类型(自定义类型)

    #define MAXSIZE 20
    typedef struct{
        char ch[MAXSIZE];
        int len;                
    }String;
    其中:MAXSIZE表示串的最大长度,ch是存储字符串的一维数组,len是字符串的长度
    初始化函数示例:

     String t;
     StrAssign(&t,"I am happy");
    int StrAssign(String *t,char *chars)
    {
        int i;
        if(strlen(chars)>MAXSIZE+1)        //字符串的长度大于数组的长度,操作失败,返回0
            return 0;
        for(i=0;i<strlen(chars);i++)
        {
            t->ch[i] = *(chars+i);        
        }
        t->len = strlen(chars);            //数组的长度
        return 1;                          //返回1,操作成功
    }
    说明:这里的StrAssign函数的参数t使用的是指针,是因为结构体变量做做形参,用法和普通变量一样属于值传递方式,在子函数中要给t赋值,所以输入的是t的指针。与之对比的是(2)子函数中T是数组,传入的是数组的首地址(改变形参也就改变了实参)。

    字符串定义的五种方法

    第1种:

    char a[5]="hello";
    第2种:

    char a[]="hello";
    第3种:

    char* a="hello";
    第4种:

    char a[10];
    gets(a);
    第5种:

    char* a[5]={"hello",
    "nihao",
    "good",
    "ok",
    "bye"};

     

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

    万次阅读 多人点赞 2018-05-30 21:20:20
    C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小。第二种没有字符串的大小限制。 #include &lt;stdio.h&gt; #include &lt;string....

    在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示
    第一种表示方式固定了每个字符串的最大大小。第二种没有字符串的大小限制。

    #include <stdio.h>
    #include <string.h>
    
    //该程序的功能是 输入阿拉伯数字的月份数 输出英文月份
    
    
    int main()
    {
        //一个字符串数组 它的下标代表英文月份的阿拉伯数字 
        char *month[] = {"January","February","March","April",
                "May","June","July","August","September","October",
                "November","December"};
        char *curMonth = month[0];
        int mon = 0;
        printf("请输入阿拉伯数字的月份数:");
        scanf("%d",&mon);
        switch(mon){
            case 1: curMonth = month[0];    break;
            case 2: curMonth = month[1];    break;
            case 3: curMonth = month[2];    break;
            case 4: curMonth = month[3];    break;
            case 5: curMonth = month[4];    break;
            case 6: curMonth = month[5];    break;
            case 7: curMonth = month[6];    break;
            case 8: curMonth = month[7];    break;
            case 9: curMonth = month[8];    break;
            case 10: curMonth = month[9];   break;
            case 11: curMonth = month[10];  break;
            case 12: curMonth = month[11];  break; 
            default : curMonth = "No this month"; 
        }
        if( strcmp(curMonth,"No this month") == 0 ){
            printf("没有这个月份\n");
        }else{
            printf("当前月份为:%s\n",curMonth);
        }
    
        return 0;
    }
    展开全文
  • C语言 字符串数组字典排序#include #include int main() { int j,k,i,t,n; char s[10][10],b[10][10]; for(i=0;ic语言,对字符串数组进行排序,从键盘中输入一个6行参考代码: #include #include #define N 100int ...
  • C语言字符串数组排序问题

    万次阅读 多人点赞 2019-05-31 22:30:49
    在用C语言解决字符串排序问题时,遇到的些问题,记录一下; 字符串的排序与平常的数字排序方法,碰壁的地方在于做 ‘交换 ’ 这一步; 1. 这是用选择排序法对一个整型数组进行从大到小的排序; //选择排序法 #include...
  • 原创 C语言字符串数组与字符串指针数组 ...
  • 和数组形式定义的字符串相同,数组形式定义字符串数组,存储了字符串字面量的副本,可以直接对这些字符串进行更改 d. 其中每个含有m个元素的数组必须不大不小的将数组填满,如果字符串长度小于m-1,其余位置就补...
  • 1、字符数组定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号...
  • c语言中,字符串是以“字符数组”存储的。 #include <stdio.h> #include <Windows.h> int main(void) { char name[32]; // C语言风格的字符串 // 相当于C++风格的: printf("请...
  • C语言字符串数组的长度函数计算

    千次阅读 2020-03-08 10:49:24
    strlen():主要负责计算字符串的长度。 (1)sizeof():数组占用字节除以数组类型所占字节,结果为数组元素个数 使用方法:sizeof(数组名)/ sizeof(数组类型名) (2)strlen():strlen,求字符串有效长度 ...
  • C语言返回字符串函数共有四种方式,分别如下: 使用堆空间,返回申请的堆地址,注意释放 函数参数传递指针,返回该指针 返回函数内定义的静态变量(共享) 返回全局变量 下面来看看详细的介绍 其实就是要返回一...
  • 详解C语言中的字符串数组

    千次阅读 2021-05-19 10:31:28
    C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示第一种表示方式固定了每个字符串的最大大小。第二种没有字符串的大小限制。#include #include //该程序的功能是 输入阿拉伯数字的月份数 ...
  • C语言字符串数组交叉输出】
  • 一:定义字符串的方法有四种: . 1.最常用的: 数组名就是地址(大多数情况下),指针也是地址 char *str4 = "abcdefghij"; 指针方式,如果操作不当,内存非法,易造成段错误 sigment error printf("%s\n",str4)...
  • C语言字符串数组

    2021-05-19 19:40:16
    字符串被存储在元素类型为 char 或宽字符类型数组中(宽字符类型指 wchar_t、char16_t 或 char32_t)。宽字符组成的字符串也称为宽字符串(wide string)。C 标准库提供了大量的函数,它们可以对...
  • 版权归原作者。 决心使用C语言来做算法题,开头很痛苦。主要是困在了C字符串的输入和赋值。 现总结一下: 1、字符串指针一定要开辟空间后在做输入 char * str; str=(char*)malloc(100*sizeof(char)); s...
  • unsigned int str_num( char *str[], int num[], ...利用一个数组,记录每个字符串的个数,另一个flag数组标记已经计数过的字符串 转载于:https://www.cnblogs.com/zzdbullet/p/9870228.html
  • 目标是创建一个动态分配的字符串数组.我已完成此操作,首先创建一个空数组并为输入的每个字符串分配适当的空间量.唯一的问题是,当我尝试实际添加一个字符串时,我得到一个seg错误!我无法弄清楚为什么,我有预感,这是...
  • 定义字符数组的时候,要保证数组的长度要比字符串的长度多一个长度,因为C语言规定:字符串都是以空字符结尾的,所以要留一个单元作为字符串结束标志。 输入输出字符串: /*方法一*/ scanf("%s",str); printf("%s\n",...
  • 直接上代码: #include"stdio.h" int main(){ char a[10]; for(int i = 0; i;i++){ printf("第%d个:",i); scanf("%c",&a[i]); } return 0; } 经典的错误,标准的零分... C语言字符串赋值的方法还有不少,值得研究。
  • C语言数组——字符数组

    千次阅读 2021-05-19 20:10:37
    往期推荐前面两篇文章分别介绍了和,今天我们一起看看字符数组字符数组字符数组顾名思义就是数组的元素类型为字符型的数组。特殊之处在于它是数组元素为字符数组。其定义的一般形式和注意事项与之前讲解的一般数组...
  • c语言中字符数组字符串)

    千次阅读 2020-06-01 10:31:27
    /*给数组字符串*/ } 上面程序在编译时, 遇到char s[30]这条语句时, 编译程序会在内存的某处留出连续30个字节的区域, 并将第一个字节的地址赋给s。当遇到strcpy( strcpy 为Turbo C2.0的函数)时, 首先在目标文件的...
  • 匿名用户1级2011-04-22 回答首先,C必然定义为字符数组C语言没有定义字符串的关键字,C语言用字符数组处理字符串。如果需要动态长度字符串必须用字符指针实现。我写了一个类似的程序。#include #include #include ...
  • c语言遍历字符串数组的方法

    万次阅读 2016-09-21 22:08:47
    在这里我们重点介绍遍历字符串的三种方法。... 我们知道,在C语言里有一个函数是“atoi”,它可以把字符串转换成整型数,包含在头文件stdlib.h中。以下是我们使用了这个函数的代码。 [objc] view plain
  • C语言字符串与字符数组 1. 字符串与字符数组 1.1 C 语言字符串 什么是字符串? 通俗的讲字符串是由一串字符组成,例如 “Hello World\n”,即是一个字符串。 C 语言中没有真正意义上的字符串类型,字符串由字符...
  • c语言中如何给字符串数组赋值

    千次阅读 2021-05-19 09:52:24
    c语言中如何给字符串数组赋值1.问题这是我写的struct student{int x;char name[10];};void main(){student st;st.name= 这里能不能直接赋值 一个字符串 “123”;? 如果不用scranf()}2.原因st.name="123"; 非法,...
  • C语言如何返回字符串数组

    千次阅读 2019-10-15 19:50:24
    学到C语言函数时,突然萌生一种想法在子函数里面输入一个数组返回到main函数里面 刚开始代码是这样写的 #include"stdio.h" char character(void); int main(void) { char temp[20]; printf("Starting !\n"); ...
  • C函数的头文件C语言里面关于字符数组的函数定义的头文件,常用函数有strlen、strcmp、strcpy等等,更详细的可以到include文件夹里面查看该文件。 下面更详细的介绍下:/*******************************************...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 144,943
精华内容 57,977
关键字:

c语言定义字符串数组

友情链接: 100-examples-for-VCPP.rar