1、单字符赋值,可通过数组下标方式或指针方式,引用数组元素,进行赋值。
例子:
char a[10];
char ch='a';
for( i=0;i<10;i++ )
a[i]=ch+i ; //可通过数组下标引用数组元素,完成赋值
char *p;
给字符数组赋值分两种情况,单字符赋值和字符串赋值。
单字符赋值,可通过数组下标方式或指针方式,引用数组元素,进行赋值,如:
char a[10];
char ch='a';
for( i=0;i<10;i++ )
a[i]=ch+i ; //可通过数组下标引用数组元素,完成赋值
char *p;
for( p=a; p *p=ch++; //通过指针对数组相应元素赋值
字符串赋值,可使用string.h头文件中的字符串操作函数进行赋值,如:
char a[10];
strcpy( a, "abcdefgh");
sprintf(a, "%s", "abcdefgh");
注意:数组在定义时,可以同时进行初始化,但定义完成后,就不能按初始化的形式对其赋值了,如:
char a[10]="abcdefgh"; //这样可以
a="abcdefgh"; //这样是错误的!a是数组名,是一个静态数据:数组首地址值,可以看作是个常数,不能再被改变。
你的意思我大概懂了!你是要实现不再定义时赋值,而是在定义后赋值吧!
这个好像不能在CZ中实现的,但是用字符指针可以实现相似的功能!具体操作如下:
#inlcude
void main()
{
char *p;
p="ddgh";
printf("%s",p);
}
用指针,在赋值的时候是先把字符串的第一个首地址赋予给p,然后再跳往下一个地址p+1,再把第二个字符放进去。
后面的输出是先把首地址输出,然后地址自动加1,再输出,就输出量字符串
不知道这个是否可以代替楼主的那种想法?
其实你的第二种赋值方式是很危险的。容易产生问题。
因为字符串"china"实际上是六个字符。
在a的后面有一个字符串结尾标识符'\0'
不过这个是个警告。
回到正题。
当你使用
char x[5]="china";
进行初始化的时候,程序会自动将'c' 'h'' 'i' 'n' 'a' '\0'依次赋值到x中
x的实际存储情况与char x[5]={'c','h','i','n','a'};完全相同
而scanf的传入的参数是x。x是数组x[]的名称。同样也是x[]的首地址
在scanf进行操作同样是将china分解,依次赋值到x[]中
当进行字符串读取的时候,程序会连续读取字符,直到遇到'\0'为止
由于你的x[5]没有存储'\0'
所以有可能会产生错误
为什么是有可能呢?
因为内存初始化的时候,x[4]的后面,很可能就是0相当于‘\0’
所以你的程序会读取到这个'\0',认为字符串已经结束
误打误撞不报错。
设有定义char s[200];
以下均可给它赋值:
定义时赋值:
char s[200]="Good Moring!";
char s[200]={'H','e','l','l','o'};
运行时赋值:
1)
for(int i=0;i<26;i++)
s[i]='A'+i;
s[i]=0;
2)
for(int i=0;(s[i]=getchar())!='\n';i++);
s[--i]='\0';
3)
int i=0;
scanf("%c",&s[i]);
while(s[i]!='\n')
scanf("%c",&s[i++]);
s[--i]='\0';
3)
gets(s); //输入的一行不超过199字符
4)
strcpy(s,"Good Morning!"); //需包含头文件string.h