精华内容
下载资源
问答
  • 对字符数组整体赋值 D.不可以用关系运算符对字符数组中的字符串进行比较 为啥c是错的嘞? 难道s[10]={"happy"}这样 的语句不算是通过赋值运算符“=”对字符数组整体赋值...
  • C++ 字符数组字符数组相互赋值

    千次阅读 2019-10-30 10:41:52
    功能:把src所指由NULL结束的字符串复制到dest所指的数组中。 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。 例如: #include <iostream> #incl...

    strcpy函数

    原型声明:extern char *strcpy(char *dest,char *src);
    头文件:string.h
    功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
    说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
    返回指向dest的指针。

    例如:

    #include <iostream>
    #include <string.h>
    using namespace std;
    int main()
    {
    	char src[128] = "hello world";
    	char dest[128] = {0};
    	strcpy(dest, src);
    	printf("dest = %s\n", dest);
    	return 0;
    }
    
    展开全文
  • 字符串字符数组赋值

    千次阅读 多人点赞 2017-07-25 14:02:49
    字符数组的定义与初始化 Char str[10] = {‘a’,‘b’,‘c’,‘d’,‘e’}; 如果说提供的字符的个数大于数组的长度,就按语法错误处理,如果小于数组的长度,不够的位置用空字符补全’\0’ 字符数组与...
    
    1. 字符数组的定义与初始化

    Char str[10] = {a’,‘b’,‘c’,‘d’,‘e};

    如果说提供的字符的个数大于数组的长度,就按语法错误处理,如果小于数组的长度,不够的位置用空字符补全’\0’

    1. 字符数组与字符串

      1)C语言中将字符串当做字符数组来处理字符串的结束标志是‘\0’,而前面的所有字符组成字符串,不算’\0’

      2)、对于字符串常量的话,系统会自动在字符串的结尾加’\0’,作为结束符,但是内存大小=字符的个数+1’\0’

    备注:’\n’ACSS0的字符,ASCII0的字符是不可显示,它只是用来辨别字符串结尾的标志

    实例:字符串数组的初始化

    char str[] = {“abc def”};

    char str[] = “abc def”;

    但是上面的例子只能用于初始化一个字符数组,并不能用于赋值,像下面的例子就是一个错误:

             Char str[];

             Srt=”abc def”;

     所以字符数组只能对其元素一个一个赋值,除此之外字符串的大小是字符个数+1因为系统自动加’\0’

    下面的例子与上面的初始化等价

    Char str[] = {‘a’,’b’,’c’,’ ’,’d’,’e’,’f’,’\0’};

    Char str[] = {‘a’,’b’,’c’,’’,’d’,’e’,’f’}的大小不同;

    1. 字符串的表示形式

      C语言中存放字符串的方式:

      1)、字符数组

      Charstr[] = “abc def”;

      2)、字符指针指向一个字符串

      Char*str = “abc def”;

      说明一下 str此时不是一个变量了,事实上它在内存的常量区,str指针指向该块内存,将字符串的首地址赋给srt

      字符串的输出方式

        printf(“%s\n”,str);这是给出了字符串的首地址,系统输出字符数据后,然后然后str自动+1指向下一个字符,直到遇到字符标志’\0’

    1. 字符串的赋值方式

      再此必须明确字符数组里放的是数组的成员,而字符指针只是放的指向字符串的首地址

      其次字符数组绝对不能赋值

      对字符数组只能对各个元素赋值,不能用以下方法对字符数组赋值
           char str[14];
           str="I love you";    
      (但在字符数组初始化时可以,即char str[14]="I love you";

    数组名是常量,故不能直接赋值,故只能用strcpy(因数组已提前分好内存了)
        
    而对字符指针变量,采用下面方法赋值:
         char* a;
         a="I love you";

    指针是变量,故可直接赋值,但不能用strcpy(因指针没有分配内存,除非提前分配好如上)

    Char buf[10];

    Char *str=buf;

    Strcopy(str,”I love you”)

     

    
    展开全文
  • 字符数组赋值

    2016-04-11 09:11:06
    http://blog.chinaunix.net/uid-26404201-id-3212247.html... 定义一个数组char a[10]; 怎么给这个数组赋值呢?...1、定义的时候直接用字符赋值 ...注意:不能先定义再给它赋值,如char a[10];...2、对数组中字符逐个赋值


    http://blog.chinaunix.net/uid-26404201-id-3212247.html

    定义一个数组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";//这种情况容易出现,a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱,不允许!
    main() 

    char s[30]; 
    strcpy(s, "Good News!"); /*给数组赋字符串*/ 

    上面程序在编译时, 遇到char s[30]这条语句时, 编译程序会在内存的某处留出连续30个字节的区域, 并将第一个字节的地址赋给s。当遇到strcpy( strcpy 为Turbo C2.0的函数)时, 首先在目标文件的某处建立一个"Good News!/0" 的字符串。其中/0表示字符串终止, 终止符是编译时自动加上的, 然后一个字符一个字符地复制到s所指的内存区域。因此定义字符串数组时, 其元素个数至少应该比字符串的长度多1。 

    展开全文
  • C字符数组赋值

    千次阅读 2015-08-10 11:57:34
    C字符数组赋值 举例如下: char a[10]; 1、定义的时候直接用字符串赋值 char a[10]="hello"; 注意:不能先定义再给它赋值,如  char a[10];  a[10]="hello"; 这样是错误的! 2、对数组中字符逐个赋值 ...

    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";//这种情况容易出现,a虽然是指针,但是它已经指向在堆栈中分配的10个字符空间,现在这个情况a又指向数据区中的hello常量,这里的指针a出现混乱,不允许!

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

    C语言的运算符根本无法操作字符串。在C语言中把字符串当作数组来处理,因此,对字符串的限制方式和对数组的一样,特别是,它们都不能用C语言的运算符进行复制和比较操作。直接尝试对字符串进行复制或比较操作会失败。例如,假定str1和str2有如下声明:

    char str1[10], str2[10];

    利用=运算符来把字符串复制到字符数组中是不可能的:

    str1 = "abc";     /*** WRONG ***/

    str2 = str1;       /*** WRONG ***/

    C语言把这些语句解释为一个指针与另一个指针之间的(非法的)赋值运算。但是,使用=初始化字符数组是合法的:

    char str1[10] = "abc";

    是因为在声明中,=不是赋值运算符。

    试图使用关系运算符或判等运算符来比较字符串是合法的,但不会产生预期的结果:

    if (str1==str2) ...    /*** WRONG ***/

    这条语句把str1和str2作为指针来进行比较,而不是比较两个数组的内容。因为str1和str2有不同的地址,所以表达式str1 == str2的值一定为0。

    strcpy和memcpy都是标准C库函数,它们有下面的特点。
    strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符

    已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);
    memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广
    void *memcpy( void *dest, const void *src, size_tcount);

    ?
    char  strcpy ( char * dest, const char * src)  // 实现src到dest的复制
    {
       if ((src == NULL) || (dest == NULL)) //判断参数src和dest的有效性
      {
      
           return NULL;
      }
       char *strdest = dest;        //保存目标字符串的首地址
       while ((*strDest++ = *strSrc++)!= '\0' ); //把src字符串的内容复制到dest下
       return strdest;
    }
    void * memcpy ( void *memTo, const void *memFrom, size_t size)
    {
       if ((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必须有效
              return NULL;
       char *tempFrom = ( char *)memFrom;             //保存memFrom首地址
       char *tempTo = ( char *)memTo;                  //保存memTo首地址      
       while (size -- > 0)                //循环size次,复制memFrom的值到memTo中
              *tempTo++ = *tempFrom++ ;  
       return memTo;
    }

    strcpy和memcpy主要有以下3方面的区别。
    1、复制的内容不同strcpy只能复制字符串而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等
    2、复制的方法不同strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出memcpy则是根据其第3个参数决定复制的长度
    3、用途不同通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy

    memset
    原型:extern void *memset(void *buffer, int c, int count);
    用法:#include <string.h>
    功能:把buffer所指内存区域的前count个字节设置成字符c。
    说明:返回指向buffer的指针。用来对一段内存空间全部设置为某个字符。
    举例:char a[100];memset(a, '\0', sizeof(a));
    memset可以方便的清空一个结构类型的变量或数组。
    如:
    struct sample_struct
    {
    char   csName[16];
    int   iSeq;
    int   iType;
    };
    对于变量
    struct sample_strcut stTest;
    一般情况下,清空stTest的方法:
    stTest.csName[0]='\0';
    stTest.iSeq=0;
    stTest.iType=0;
    用memset就非常方便:
    memset(&stTest,0,sizeof(struct sample_struct));
    如果是数组:
    struct sample_struct   TEST[10];
    memset(TEST,0,sizeof(struct sample_struct)*10);
    对这个问题有疑问,不是对函数的疑问,而是因为没有弄懂mem和str的区别。
    mem是一段内存,他的长度,必须你自己记住
    str也是一段内存,不过它的长度,你不用记,随时都可以计算出来
    所以memcpy需要第三个参数,而strcpy不需要

    (一)strcmp函数  

             strcmp函数是比较两个字符串的大小,返回比较的结果。一般形式是:  

                     i=strcmp(字符串,字符串);

             其中,字符串1、字符串2均可为字符串常量或变量;i   是用于存放比较结果的整型变量。比较结果是这样规定的:  

    ①字符串1小于字符串2,strcmp函数返回一个负值;

    ②字符串1等于字符串2,strcmp函数返回零;

    ③字符串1大于字符串2,strcmp函数返回一个正值;那么,字符中的大小是如何比较的呢?来看一个例子。

             实际上,字符串的比较是比较字符串中各对字符的ASCII码。首先比较两个串的第一个字符,若不相等,则停止比较并得出大于或小于的结果;如果相等就接着 比较第二个字符然后第三个字符等等。如果两上字符串前面的字符一直相等,像"disk"和"disks"   那样,   前四个字符都一样,   然后比较第 五个字符,   前一个字符串"disk"只剩下结束符'/0',后一个字符串"disks"剩下's','/0'的ASCII码小于's'的ASCII 码,所以得出了结果。因此无论两个字符串是什么样,strcmp函数最多比较到其中一个字符串遇到结束符'/0'为止,就能得出结果。

    注意:字符串是数组类型而非简单类型,不能用关系运算进行大小比较。  

             if("ABC">"DEF")   /*错误的字符串比较*/

             if(strcmp("ABC","DEF")   /*正确的字符串比较*/

    (二)strcpy函数  

             strcpy函数用于实现两个字符串的拷贝。一般形式是:  

                     strcpy(字符中1,字符串2)

             其中,字符串1必须是字符串变量,而不能是字符串常量。strcpy函数把字符串2的内容完全复制到字符串1中,而不管字符串1中原先存放的是什么。复制后,字符串2保持不变。  

    例:    

             注意,由于字符串是数组类型,所以两个字符串复制不通过赋值运算进行。  

             t=s;   /*错误的字符串复制*/

             strcpy(t,s);   /*正确的字符串复制*/

    昨天在用结构体指针给结构体赋初值的时候,犯了一个错误(main函数中被注释掉的那一句话)。而应该采用strcpy的方式把一个字符串放入字符数组中去,对此我将沿着我探讨这个问题根源的思路做一个分享

    #include <stdio.h>

    #include <string.h>

    #include <malloc.h> 

    typedef struct student_info

    {

           int number;

           char name[32];

    }stu, *p_student;

    int main()

    {

           stu a;                                   //注意要定义一个结构体出来

           p_student p = NULL;

           p = &a;

           p->number = 1;

           //p->name = “aa”;  //错误

           strcpy(p->name, “aa”); //正确

           printf("%d:%s\n", p->number, a.name);

           return 0;

    }

    在发现这个问题之后,我进行了如下的几个尝试:指针对这个数组成员不能赋值,那直接用结构体变量是否可以?(不行);采用普通方式,对结构体变量a在定义的时候初始化,是否可行?(可行)

    那么最终问题在于数组初始化和赋值的方面,对此进一步采用了几个程序,对该知识点进行了深入的理解,程序如下

    #include <stdio.h>

    #include <string.h>

    int main()

    {

           char a[] = "abcdef";

           char *p = "abcdef";

           char *p_a = NULL;

           //p_a = a;

           //fun(&p_a);

           //a[0] = 'z';

           //a = "z";

           //a = 'z';

           strcpy(a, "zf");

           //p = "z";

           *p = 'z';

           printf("%s\n", a);

           printf("%s\n", p);

           //printf("%s\n", p_a);

           return 0;

    }

    int  fun(char **ar)

    {

           //char **p_a = &ar;

           *ar = "zef";

           //ar[0] = 'z';

    //     strcpy(ar, "z");

           return 1;

    }

    以上是我在做知识点归纳时用的源程序,比较混乱,敬请了解。一下我将解释一下,我到底做了那几个方面的工作和讨论

    由于关系到字符数组的赋值问题,我想到了这个例子,实验了一下区别

    把两个相同的字符串分别赋给一个字符数组,和字符型指针。结果:均可以打印出来

    那么它们能否再被赋值修改呢?

    于字符数组而已只能通过a[0] = 'z';或者strcpy(a, "zf");这样的方式对其进行修改,总结的时候再归纳原因

    对于字符型指针p = "z";可以但是注意这里的实质却并没有对p字符串进行修改而*p = 'z';是不可行的

    归纳总结一:

           参考网络知识和《c和指针》中关于字符数组的初始化部分

    (注意:需要提前搞清楚,什么是赋值,什么是初始化,什么是定义。相关知识可以参考网络资料,eg:int a;(定义),int a = 10;(初始化),a = 10;(赋值))

    1对于字符数组:

           char a[15] = “abcdef”;

    但不能做如下操作

           char a[15];

           a[15] = “abcdef”;

    特别注意:第一种初始化的方式,看似左值是个字符串,其实不然,它其实是个初始化列表。最后列表包含\0

    因此,字符数组是不能将字符串赋给它的

           所以在后续的赋值里必须对数组元素进行赋值

    2对于字符串

           char *p = “abcdef”;

    注意这里不是把一个字符串赋给了一个字符型的指针,而是把一个字符型的指针指向了字符串的首地址

           所以上面p = "z"只是把指针指向了另一个地方而已

    3对于数组与字符串在机器中的存储

           数组

                         数组在机器中,当被定义时eg:char a[10];就已经分配好了内存空间,放在了数据段中,其中的数值是可以进行修改的

           字符串

                         字符串在内存中也被存放在了数据段中,但是字符串又称为字符串常量,是编译器“钉死”无法修改的,所以*p = 'z';想改变字符串的值是不被允许的

    之后我又进行了一些尝试,那就是将数组作为一个函数的参数进行传递,看变换,这个知识点,我不做操作上的过多复述。

    归纳总结二:

           在此之前,我们首先得理解,数组名。数组名表示着这个数组的入口地址,这一点与函数名,结构体标识等类似。

           eg:char a[10];那么a表示的是这个数组第一个元素的地址即&a[0];

           而&a;表示的是这个数组的首地址

           估计不少人这个时候糊涂了,这两个有区别吗?数值不一样么?

    它们两个的数值是一样的,因为地址只有一个,数组的一个元素的地址的值就是这个数组的地址的值,那么为什么还要分这么细致呢?下面举个例子

    eg:

           char a[10];

           char *p = NULL;

           char (*p_a)[10] = NULL;

           p = a;

           p_a = &a;

    如上面这个例子,a只能赋给一个char型的指针而&a只能赋给一个指向一个数组的指针(注意这里的这个数组要与你定义的那个a数组同大小)

    借助指针,我们不难理解,其实他们所代表的一个指针的类型是截然不同的(如果不能理解请参考c相关教程中指针的概念)

    进入正文,所以当一个数组被传递如函数的时候可以把数组名传进去也就是把这个数组的第一个元素的首地址传进去

    作为指针被传进去的数组名这时和指针是完全一致的,可以作为指针使用,当然为直观化,可以用做数组

    eg:

           char a[10];

           int fun(char *a)

           {

                         a[0] = ‘A’;

    }


    展开全文
  • C++中的字符数组逐个赋值时报错的解决方法  C++中定义一个字符数组的时候,如果初始化,则cout的时候不会出错,但是在逐个字符赋值的时候,很容易出错。 #include #include using namespace std; int ...
  • C++字符数组赋值

    2015-06-09 17:10:32
    怎么给这个数组赋值呢? 1、定义的时候直接用字符赋值 char a[10]="hello"; 注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的! 2、对数组中字符逐个赋值 char a
  • 指针指向字符数组赋值与输出

    千次阅读 2016-03-01 16:13:22
    1.#include  void main() {  char *s,c[80];  s=c;... printf("请输入c字符数组:");... gets(s);... s+=3;... printf("请输入指针s指向的字符数组:");... gets(s); //重新输入指针s指向的字符数组
  • 包含字符数组的结构体的初始化: 如一个包含着字符数组的结构体,定义如下 typedef struct st_IGMInfo { /* IGM name */ char Name[100]; /* Mac address */ unsigned char MAC[6]; /* IGM location */
  • 最近遇到了给数组为0的字符数组
  • 给结构体中字符数组赋值

    千次阅读 2018-10-24 16:43:20
    先看一段代码:   #define _CRT_SECURE_NO_WARNINGS 1 #include ...//直接赋值 printf("%s\n", stu.name);...(1)首先,其实是忘记了C++的基础问题...总结:结构体字符数组赋值必须用字符串函数,不能直接进行赋值
  • 字符串其实就是特殊的字符数组,只是同样的输入时字符串后面系统会自动加上&quot;\0&quot;而已罢了。 学了这么久的C语言,突然发现连字符赋值都出错,真的很痛哭流涕。 先给出一段我写错的代码。 char a...
  • 字符数组: char str1[]="abcdef"; char str2[]="qwerty" str1 和str2 的地址都在栈里,如果要交换str1和str2的值只需 char *p=(char *)malloc(n*sizeof(char)); //n为str1/str2的字符个数(包括'\0') strcpy(p,str1)...
  • 用来存放字符的数组称为字符数组,例如: char a[10];//一维字符数组 char b[5][10];//二维字符数组 char c[20]={'c',' ','p','r','o','g','r','a','m'};// 给部分数组元素赋值 char d[]={'c',' ','p','r','o','...
  • C语言中二维字符数组应该怎样赋值?c语言二维数组如何定义字符串????急。。。二维字符数组的定义格式为:char 数组名[第一维大小][第二维大小]; 例如:char c[3][10]; //定义了一个3行10列的二维字符数组c 由于...
  • 字符数组赋值的方法

    千次阅读 2018-11-29 16:19:24
    字符数组赋值的方法 2018年07月06日 15:15:07 kkwant 阅读数:29 标签: 赋值方法语言编译器string字符数组存储 原文地址为:给字符数组赋值的方法 main()  {  char s[30];  strcpy(s, "Good News!...
  • 结构体变量中,字符数组赋值方法(谭浩强的c++程序设计第三版第201页例题5) 看原代码(书上的): #include <iostream> #include<string> using namespace std; struct Student { int num; ...
  • #include #include int main(){// char array[] = "dagaga diiab";// char str[] = "aw"; char array[5] = {d,a,w,s,/0}; char str[3] = {a,w,/0}; // char *array = "da
  • C++ 字符数组赋值

    千次阅读 2019-04-19 14:41:20
    3、(1)如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预测的; (2)如果花括号中提供的初值个数(即字符个数)大于数组长度,则按语法错误处理; (3)如果花括号中提供的初值...
  • C语言 字符数组赋值

    千次阅读 2018-05-29 09:24:00
    /给数组字符串/ . . . } 上面程序在编译时, 遇到char s[30]这条语句时, 编译程序会在内存的某处留 出连续30个字节的区域, 并将第一个字节的地址赋给s。当遇到strcpy( strcpy 为 Turbo C2.0的函数)时, 首先在目标...
  • 前言:想用字符指针数组char* strArr[10];存储多个字符串,通过while循环赋值产生的bug。 先看一段代码: main(){ char *strArr[5];//存储字符串的数组 char str[10]; int i = 0; char *p = NULL; while (i<...
  • 二维字符数组赋值
  • 字符数组赋值

    2009-10-10 10:51:00
    怎么给这个数组赋值呢?1、定义的时候直接用字符赋值char a[10]="hello";char s[20]={"I am buddha!"};char s[20]="I am buddha!";char s[]="I am buddha!";注意:不能先定义再给它赋值,如char a[10]; a[10]=...
  • Java给字符数组动态赋值

    万次阅读 2018-05-11 19:20:53
    int n = 20;String [] s = new String[n];for(int i = 0; i &lt; n; i++){ s[i] = String.valueOf(i);};
  • 字符数组赋值,以及memset用法注意

    千次阅读 2013-05-11 22:10:06
    1,字符数组赋值 char a[10]; 怎么给这个数组赋值呢? 1、定义的时候直接用字符串赋值 char a[10]="hello"; 注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的! 2、对数组中字符逐个...
  • C语言 字符数组赋值的方法 整理

    千次阅读 2015-03-15 18:38:03
    怎么给这个数组赋值呢? 1、定义的时候直接用字符串初始化 char a[10]="hello"; 注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的!只有定义初始化是才能这样赋值 2、对数组中字符逐个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 238,492
精华内容 95,396
关键字:

对字符数组s赋值