单选题
1、第156题 (1.0分) 题号:653 以下程序段中,不能正确赋字符串(编译时系统会提示错误)的是()。
A
char s[10]=“abcdefg”;
B
char t[]=“abcdefg”,*s=t;
C
char s[10];s=“abcdefg”;
D
char s[10];strcpy(s,”abcdefg”);
答案解析
正确答案:C
解析:
**正确答案:C**
### 解析:
本题考查 C 语言中字符数组的初始化与赋值规则,特别是数组名作为左值的特性。
1. **选项 A:`char s[10]="abcdefg";`**
* **正确**。这是在定义字符数组时进行**初始化**。C 语言允许在定义数组时使用字符串常量进行初始化,编译器会将字符串 `"abcdefg"`(包括结尾的 `\0`)复制到数组 `s` 中。只要数组长度足够容纳字符串(这里长度为 10,字符串占 8 字节),就是合法的。
2. **选项 B:`char t[]="abcdefg",*s=t;`**
* **正确**。
* `char t[]="abcdefg"`:定义并初始化字符数组 `t`。
* `*s=t`:定义字符指针 `s`,并将数组 `t` 的首地址赋给指针 `s`。在 C 语言中,数组名在表达式中代表数组首元素的地址,因此将数组名赋给同类型的指针是合法的操作。
3. **选项 C:`char s[10]; s="abcdefg";`**
* **错误**。
* `char s[10];` 定义了一个字符数组。
* `s="abcdefg";` 试图将字符串常量 `"abcdefg"` 的地址赋给数组名 `s`。
* **核心原因**:在 C 语言中,**数组名是一个常量指针**(即地址常量),它指向数组分配内存的首地址。数组名不能作为左值被修改,也就是说,你不能改变数组名所代表的地址。因此,不能使用赋值运算符 `=` 直接将字符串或地址赋给已经定义好的数组名。若要给已定义的数组赋值字符串,必须使用 `strcpy` 函数或逐个字符赋值。
4. **选项 D:`char s[10]; strcpy(s,"abcdefg");`**
* **正确**。
* `strcpy` 是标准库函数 `` 中的字符串复制函数。
* 它将源字符串 `"abcdefg"` 的内容逐个字符复制到目标数组 `s` 指向的内存空间中。这是给已定义的字符数组赋值字符串的标准方法之一。
### 总结:
* **初始化时**:可以使用 `=` 配合字符串常量(如选项 A)。
* **定义后赋值**:
* 不能直接用 `=` 给数组名赋值(如选项 C,编译报错)。
* 可以使用 `strcpy` 函数(如选项 D)。
* 可以将数组地址赋给指针变量(如选项 B)。
因此,不能正确赋字符串且编译时会提示错误的是 **C**。
题目纠错
c语言选择判断题库
相关题目
单选题
1、第103题 (1.0分) 题号:213 C语言中,文件由()。
单选题
1、第102题 (1.0分) 题号:544 char *s1=“hello”,*s2;s2=s1;则()。
单选题
1、第101题 (1.0分) 题号:160 C语言的if语句嵌套时,if与else的配对关系是()。
单选题
1、第100题 (1.0分) 题号:625 已知x=43,ch='A',y=0;则表达式( )的值是()。
单选题
1、第99题 (1.0分) 题号:692 以下叙述中正确的是()。
单选题
1、第98题 (1.0分) 题号:668 以下正确的说法是()。
单选题
1、第97题 (1.0分) 题号:643 以下能对一维数组a进行正确初始化的语句是()。
单选题
1、第96题 (1.0分) 题号:526 用户定义的函数不可以调用的函数是()。
单选题
1、第95题 (1.0分) 题号:532 结构体类型的定义允许嵌套是指()。
单选题
1、第94题 (1.0分) 题号:164 下列数组说明中,正确的是()。
