精华内容
下载资源
问答
  • 字符串赋值

    2020-08-05 11:17:25
    我们可以知道:char*p="helo"这种字符串赋值方式是完全没有问题的。要理解这种赋值方式,我们首先得理解双引号(特別注意:这个是双引号,不要赋值的时候给弄了个单引号)在这个语句中做了什么工作。双引号主要做...

    我们可以知道:char*p="helo"这种字符串的赋值方式是完全没有问题的。要理解这种赋值方式,我们首先得理解双引号(特別注意:这个是双引号,不要赋值的时候给弄了个单引号)在这个语句中做了什么工作。双引号主要做了3个工作,分别
    (1)申请了空间(在常量区),存放了字符串。
    (2)在字符串尾加上了^0”。
    (3)返回地

    下面是转载:
    学了这么多年的C语言,突然发现连字符串赋值都出错

    char a[10];
    怎么给这个数组赋值呢?
    1、定义的时候直接用字符串赋值
    char a[10]=“hello”;
    注意:不能先定义再给它赋值,如char a[10]; a[10]=“hello”;这样是错误的!
    2、对数组中字符逐个赋值
    char a[10]={‘h’,‘e’,‘l’,‘l’,‘o’};
    3、利用strcpy
    char a[10]; strcpy(a, “hello”);

    易错情况:
    1、char a[10]; a[10]=“hello”;//一个字符怎么能容纳一个字符串?况且a[10]也是不存在的!
    2、char a[10]; a=“hello”;//这样的情况easy出现,a尽管是指针,可是它已经指向在堆栈中分配的10个字符空间,如今这个情况a又指向数据区中的hello常量,这里的指针a出现混乱,不同意!

    还有:不能使用关系运算符“==”来比較两个字符串,仅仅能用strcmp() 函数来处理。

    在C语言中,字符串是当做字符数组来处理的;所以字符串有两种声明方式,一种是字符数组,一种是字符指针。

    (1)直接逐个初始化字符数组:字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。

    char str[10]={ ‘I’,’ ‘,‘a’,‘m’,’ ‘,‘h’,‘a’,‘p’,‘p’,‘y’};
    注意:如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即’\0’ )。

    (2)用字符串常量来初始化字符数组:在c语言中,将字符串作为字符数组来处理。因此可以使用字符串来初始化字符数组。

    char str[]={“I am happy”};
    也可以省略花括号:
    char str[]=“I am happy”;
    但是,上述这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,下面的赋值方法是错误的
    char str[];
    str=“I am happy”;//错误,字符数组的赋值只能按元素一一赋值

    其中字符数组初始化也有两种方式:
    1.char parr[] = “zifuchuanshuzu”;
    //等价于charr_test[]
    2.char charr_test[] = { ‘z’,‘i’,‘f’,‘u’,‘c’,‘h’,‘u’,‘a’,‘n’,‘s’,‘h’,‘u’,‘z’,‘u’ ,’\0’};
    //与charr[]不等价
    3.char charr[] = { ‘z’,‘i’,‘f’,‘u’,‘c’,‘h’,‘u’,‘a’,‘n’,‘s’,‘h’,‘u’,‘z’,‘u’ };
    这种方法是错误的,字符串一定是以’\0’结尾的;字符数组和字符指针我们当做字符串整体初始化,系统会自动添加’\0’;对于字符数组,如果采用单个字符的方式进行初始化或者赋值一定要考虑结束符’\0’.

    (3)字符指针:在C语言中我们也可以使用字符指针来存储字符串。
    字符指针初始化:

    char* str=“zifuchuanshuzu”

    展开全文
  • C语言中没有字符串类型,字符串是存放在字符型数组中的,所以字符串有两种声明方式,一种是字符数组,一种是字符指针。 (2)关于字符数组的初始化 直接逐个初始化字符数组: char ch[11...

    (1)什么是字符数组?

    字符数组是指用来存放字符数据数组。其定义的一般形式为: char 数组名[数据长度]字符数组用于存放字符字符串,字符数组中的一个元素存放一个字符,它在内存中占用一个字节
    C语言中没有字符串类型,字符串是存放在字符型数组中的,所以字符串有两种声明方式,一种是字符数组,一种是字符指针。



    (2)关于字符数组的初始化

    • 直接逐个初始化字符数组:
    char ch[11]={'I',' ','l','o','v','e',' ','y','o','u'};
    

    注意:如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即’\0’ )。

    • 用字符串常量来初始化字符数组:
    char ch[]={"I love you"};
    //也可以省略花括号
    char ch[]="I love you";
    

    但是,上述这种字符数组的整体赋值只能在字符数组初始化时使用,不能用于字符数组的赋值,字符数组的赋值只能对其元素一一赋值,下面的赋值方法是错误的:

    //定义数组时没有定义大小,也没有进行赋值,报错
    char ch[];
    
    //定义数组时定义了大小,但随后对其进行赋值,报错
    char ch[11];
    ch="I love you";//错误,字符数组的赋值只能按元素一一赋值(错误的原因: C语言并没有提供可以直接操作字符串的运算符;“=”可以用于其他数据类型的赋值,但是不可以直接给字符串赋值。
    

    以上就是初始化字符数组的两种方式,但要注意它们其实并不是等价的,因为它们的数组长度其实是不同的,我们来看一个例子就可以了:
    Example:

    int main(){
        char ch[]="I love you";//10个字符
        printf("The ch[] is: %s\n",ch);
        printf("The size of ch[] is %d\n\n",sizeof(ch));
    
        char chr[]={'I',' ','l','o','v','e',' ','y','o','u'};//也是10个字符
        printf("The chr[] is: %s\n",chr);
        printf("The size of chr[] is %d\n\n",sizeof(chr));
    
        char chrr[]={'I',' ','l','o','v','e',' ','y','o','u','\0'};//结尾加上'\0'
        printf("The chrr[] is: %s\n",chrr);
        printf("The size of chrr[] is %d\n\n",sizeof(chrr));
        return 0;
    }
    

    输出结果:在这里插入图片描述
    从结果可以看到第二种初始化方式,打印的结果有问题,但是字符数量没有问题。这是因为字符串默认是以’\0’结束的,第二种初始化方式中没有’\0’,而我们以字符串方式打印,所以会出错。
    第一种系统自动添加了’\0’,我们可以看到其字符数量是11(与第三种相同)



    (2)关于字符指针的初始化

    字符指针:在C语言中我们也可以使用字符指针来存储字符串。

    • 字符数组字符指针区别
      以此方式定义的字符串,同样可以对此字符串进行多样的操作。为什么可以用字符数组表示字符串,非要弄个指针来表示字符串呢?这其中定有深意。原来它们最根本的区别在内存中的存储区域不一样字符数组存储在全局数据区或栈区,而以指针形式表示的字符串却存储在常量区全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。一句话概括:数组形字符串存放在全局数据区或栈区,可读可写。指针字符串存放在常量区,只读不能写。
    • 字符指针初始化:
    char* str="I love you";
    

    C语言对字符串常量是按照字符数组来处理的,在内存中开辟了一个字符数组用来存放字符串常量,程序在定义字符串指针变量str时,只是把字符串首地址赋值给str

    • 输出方式:
     printf("%s",str);
    
    • 可以对其进行赋值:
    int main(){
        char* str;
        str="I love you";//正确,可以赋值
        printf("%s",str);
        return 0;
    }
    




    (3)关于字符串处理函数strcpy、strcat、strcmp

    strcpy的原型:char *strcpy(char * dest,const char * src);
    头文件:string.h和stdio.h*
    功能:将src地址开始且包含’\0’结束符的字符串复制到以dest开始的空间。
    注: 字符数组dest必须是数组名形式,src可以是数组名也可以是字符串常量 可以用strcpy将src的前若干个字符复制到字符数组中


    strcat的原型:char *strcat(char * dest,const char * src);
    头文件:string.h
    功能: 把src中的内容复制到dest结尾处(覆盖’\0’)
    注: src和dest内存区域不可以重叠dest必须有足够的空间来容纳src; 字符数组dest必须是数组名形式,src可以是数组名也可以是字符串常量返回指向dest的指针

    int main(){
        char ch[50];
        strcpy(ch,"Hello world!");
        printf("The ch[] is: %s\n\n",ch);
    
        char chr[]="I like programming!Test_example";
        char test_chr[20];
        chr[19]='\0';//复制chr的前19个字符
        strcpy(test_chr,chr);
        printf("The test_chr[] is: %s\n\n",test_chr);
    
        //字符串链接
        strcat(ch,test_chr);
        printf("The ch[] is: %s\n\n",ch);
        return 0;
    }
    
    

    输出结果:
    在这里插入图片描述


    strcmp的原型:int strcmp(const char *s1,const char *s2);
    功能:strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。

    int main(){
        char ch[50]="Hello world!";
        char chr[]="I like programming!Test_example";
        int tmp=strcmp(ch,chr);
        if(tmp==0){//说明ch等于chr
            printf("%s 等于 %s",ch,chr);
        }else if(tmp>0){//说明ch大于chr
            printf("%s 小于 %s",ch,chr);
        }else{//说明ch小于chr
            printf("%s 大于 %s",ch,chr);
        }
        return 0;
    }
    
    

    输出结果:
    在这里插入图片描述




    (4)一些需要注意的地方

    (1)在C语言中并没有直接提供字符串的操作,其字符串操作是通过转化为字符串完成的,例如字符数组,字符指针,其本质是对字符的操作
    (2)作为字符数组,与普通数组相同,区别在于它的每一个元素是一个字符,所以不可以直接用“=”对字符数组赋值
    (3)字符串一定是以’\0’结尾的;字符数组和字符指针我们当做字符串整体初始化,系统会自动添加’\0’;对于字符数组,如果采用单个字符的方式进行初始化或者赋值一定要考虑结束符’\0’
    (4)strcpy和strcat内部也是对字符的操作,以‘\0’作为字符串结束的标志

    展开全文
  • 今天看到了gets()与puts()函数,发现了一个奇怪的点:字符串可以直接赋值给字符指针变量。例如以下: char * p="EDS"; puts(p); //输出结果为EDS 学过指针让我清楚明白了指针变量是不能直接赋值的,而这里的字符...

    今天看到了gets()与puts()函数,发现了一个奇怪的点:字符串可以直接赋值给字符指针变量。例如以下:

    char * p="EDS";
    puts(p);    //输出结果为EDS

    学过指针让我清楚明白了指针变量是不能直接赋值的,而这里的字符指针却直接被赋值字符串。这让我深感疑惑了,经过查阅,才知道:

    char * p="EDS"; 双引号在这里做了这三件事情:

    • 1. 申请了空间(在常量区),存放了字符串 
    • 2. 在字符串尾加上了'/0'    
    • 3. 返回该字符串的首地址

    先来看puts()这个函数 

    函数原型

    int puts(const char *string);

    参数

    输入:字符串指针

    输入可以是字符串数组,也可以是字符串常量,例如:

    char a[15]="1234";    //字符串数组
    char * p="EDS";    //字符串常量
    p=a;    //将a的首地址赋值给p,p指向了a字符串数组
    puts(p);    //输出结果为1234

    puts()函数的输入是一个字符串指针。当使用一个字符串数组名作为输入时,数组名此时表示一个指向数组的指针值,这符合puts()的输入要求,并能够正确输出。但是,当输入为一个字符串常量时,函数仍然能够正常的输出字符串。 
    理由如下: 

    1. 如上所述,双引号的加入,返回了字符串常量的地址值,即指针,这样才能够满足puts()函数对输入参数的要求,而这个指针应该指向了字符串常量实际所在的地址。 
    2. 程序运行时,双引号分配了常量区空间,字符串常量将占用内存空间,这样才能保证puts()函数能通过指针找到要输出的数据。 既然字符串常量占用内存,那么应该就能够通过得到它的地址并输出。

    另外看一下下面的这组区别,char a[10] = “hello”; 这是数组的初始化,和a[0] = ‘h’ a[1] = ‘e’…是一个道理,但是换成char a [10],然后a = “hello”就不行了 “hello”赋值的值是一个地址,而a虽然也有地址,但是这与指针是不一样的,指针的值是地址,而数组的值虽然也是地址,但是却是一个地址常量,所以不能给常量赋值。所以,可以把字符串赋值给指向字符指针变量p,而不能把字符串赋值给一个字符数组。

    展开全文
  • C语言中,为什么字符串可以赋值给字符指针变量 char *p,a='5'; p=&a;//显然是正确的, p="abcd"; //但为什么也可以这样赋值?? 问:一直理解不了为什么可以将字串常量赋值给字符指针变量? 答:双引号做了3...

    C语言中,为什么字符串可以赋值给字符指针变量

    char *p,a='5';
    p=&a;                  //显然是正确的,
    p="abcd";              //但为什么也可以这样赋值??

    问:一直理解不了为什么可以将字串常量赋值给字符指针变量?

    答:双引号做了3件事: 

        1、申请了空间(在常量区),存放了字符串

        2、在字符串尾加上了'/0'    

        3、返回地址

    这里就是 返回的地址  赋值给了  p

    展开全文
  • 字符串赋值

    万次阅读 多人点赞 2017-12-05 20:48:50
    1、定义的时候直接用字符串赋值 char a[10]="hello"; 注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的! 2、对数组中字符逐个赋值 char a[10]={'h','e','l','l','o'}; 3、利用strcpy ...
  • 字符串整体赋值问题 char a[10]="hello"; a="word";//这里是错误的不能整体赋值 因为:数组名的实质是指针常量,你不能给一个指针常量修改。 解决方法: 1 字符串整体比较问题 ...
  • 字符串赋值操作

    千次阅读 2017-04-14 09:36:22
    用常量字符串赋值,下面代码中的str1; 直接用另一个字符串赋值,见str2; 用一个字符串的前一段子串赋值,str3; 用另一个字符串的一个子串赋值,str4; 用几个相同的字符,赋值,见str5.   &2 测试源代码  ...
  • C#为字符串数组动态赋值的问题

    千次阅读 2017-09-29 11:33:00
    今天才发现一个很简单很基本的问题,就是怎么也不能正确。 方法1: string[] a; a[0] = "we";MessageBox.Show(a[0]); //使用了未赋值的局部变量a 方法2: string[] a = new string[] { }; a[0] = "we"; MessageBox...
  • 字符串赋值问题

    千次阅读 2012-03-29 00:17:11
    字符串赋值,本质上并不是变量赋值了整个字符串,而是将字符串的首地址给了变量,因此呢要想对字符串赋值有3种方法,   方法一:首先要有一个指向字符的指针用来存放这个字符串的首地址。 例如 char *p;下面...
  • C语言中字符串赋值处理方式

    万次阅读 多人点赞 2016-11-18 09:45:28
    因为c语言没有直接对字符串提供语法糖方面的支持。而且C标准库很多方法处理字符串是以空字符结尾为前提的,这个必须要记住。char *p,a='5'; p=&a; //显然是正确的, p="abcd"; //但为什么也可以这样赋值??答: 双...
  • 字符串的创建与赋值

    2019-12-03 18:32:33
    一、字符串的创建与赋值 字符串或串(String)是由数字、字母、下划线组成的一串字符。Python 里面最常见的 类型。 可以简单地通过在引号间(单引号,双引号和三引号)包含字符的方式创建它。 其中单引号和双引号形式类似...
  • javascirpt - 字符串的换行赋值

    千次阅读 2010-09-02 15:34:00
    js中硬回车一般被解析为分号,表示语句的结束。但这里显然不是这样,可以推测这里硬回车被语句后面的 “/”或"+" 转义(不确定),反正最终语句应该被解析为了第一种赋值,以至于正确运行。
  •  则正确的叙述为正确答案: C 你的答案: A (错误)数组acX和数组acY等价数组acX和数组acY的长度相同数组acX的长度大于数组acY的长度数组acX的长度小于数组acY的长度字符串赋值时以‘\0’结尾,所以长度要更长1....
  • 如何给一个字符指针char *p 赋值?...错误提示的意思是我们将一个字符串常量绑定地址绑定到了一个非常量字符指针上,C语言中隐式转换成了char* ,但是c++就拒绝了这个操作,让人自行承担这个后果,所...
  • 结构体中字符串赋值

    万次阅读 多人点赞 2016-06-26 23:49:05
    #include using namespace std; struct student { int num; char name[10]; }; int main() { student st; st.num = 10; //st.name = "linjunjie... //字符串不能用=赋值 strcpy(st.n
  • 对于这个声明方式,会造成的误解是:声明了一个字符指针(它会指向一个位置),将“字符串赋值给 指针表达式"*a"所指向的地址。但正解是:声明了一个字符指针后,并用字符串常量的第一个字符的地址赋值给指针变量a...
  • 问不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组赋值。“ 那么str1=“China”是不是错的? char a[ ]=‘toyou’; 为什么是正确的呢? 举例如下: char s[20];s=“helo”;这样是错误的,原因就是不能...
  • 1、我们可以在定义的时候给他赋值 char *p = “hello” ...2、定义之后我们可以利用strcpy进行赋值 例如;char a[20] ; strcpy(a,“hello”); 易错情况: 1、char a[10]; a[10]=“hello”...
  • 5种字符串赋值方法

    万次阅读 2018-02-20 20:55:00
    public class CreatString { public static void main...//直接引用字符串常量 System.out.println(a+"\n"); String b =new String("爱拼才会赢");//利用构造方法实例化 Str...
  • 字符数组用字符串赋值的三种可行形式: 1、定义的时候直接用字符串赋值 char a[10]="hello"; 【注意】不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的,一个字符怎么能容纳一个字符串?况且a[10...
  • 在写程序的时候,总是搞混,现在总结一下以免...1、定义的时候直接用字符串赋值 char a[10]="hello"; 注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的! 2、对数组中字符逐个赋值 char a
  • 不能用字符串给字符数组赋值

    千次阅读 2015-04-19 17:01:55
    一个字符串,如"hello",一般为字符串常量,可以用它字符指针赋值,或初始化,相当于把这个字符串常量的首地址赋给这个指针,如: char *p = "hello";  或者 char *p; p="hello"; 但是,当用"hello...
  • C语言中,为什么字符串可以赋值给字符指针变量 本文是通过几篇转帖的文章整理而成的,内容稍有修改: 一、 C语言中,为什么字符串可以赋值给字符指针变量 char *p,a='5'; p=&a; //显然是正确的, p="abcd"; //...
  • 字符串赋值

    千次阅读 2014-04-11 10:50:04
    但是通常的字符串“adsfs”,它的类型是const char*类型的,所以不能直接用字符串的 字面值赋给 wchar_t* 。正确的做法是: wchar_t * str = L"abcd"; 同样针对char字符集的函数不能用在unicode字符集上,例如...
  • 如何给字符串数组赋值

    千次阅读 2015-06-22 22:19:57
    1、定义的时候直接用字符串赋值 char a[10]="hello"; 注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的! 2、对数组中字符逐个赋值 char a[10]={'h','e','l','l','o'}; 3、利用strcpy ...
  • 1)下面两种方式的字符串赋值正确 char str1[] = "hello str1"; char *str2= "hello str2"; char *str3; str3 = "hello str3"; 2)char str1[] = "hello str1"; 是将字符串赋值给数组,字符串存在数组里(这里...
  • 字符型指针,数组,字符串赋值

    千次阅读 2019-07-09 10:17:44
    C语言中,为什么字符串可以赋值给字符指针变量 char *p,a='5'; p=&a; //显然是正确的, p="abcd"; //但为什么也可以这样赋值?? 问:一直理解不了为什么可以将字串常量赋值给字符指针变量,请各位指点! 答...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 216,416
精华内容 86,566
关键字:

对字符串进行正确赋值