首页 > 试题广场 >

下面程序的输出结果是 char *p1= "123", *p

[单选题]
下面程序的输出结果是
char *p1 = "123", *p2 = "ABC", str[50]= "xyz";
strcpy(str + 2, strcat(p1, p2));
cout << str;

  • xyz123ABC
  • z123ABC
  • xy123ABC
  • 出错
推荐
【正确答案】D
【解析】1.在 C++ 代码中,char * p1 = "123";会编译报错。
2.即使在 C 代码中,char * p1 = "123";编译通过,由于 p1,p2 都是常量,所以通过 strcat(p1,p2) 会报错。

字符串处理函数知识点讲解】
更多C++基础专业知识讲解,点击链接即可查看
https://www.nowcoder.com/link/zxyl-cpp11
编辑于 2021-11-17 14:59:25 回复(0)
分析:p1和p2指向的是常量存储区的字符串常量,没法连接,会有问题
发表于 2014-11-13 22:51:14 回复(2)
char* strcat(char *,const char*)//第一个参数所指向的内容必须可以修改,可以赋值为在栈上分配的数组
strcat(p1,p2)试图修改p1的内容,p1指向文字常量区,其指向的内容无法修改
编辑于 2016-06-13 10:20:30 回复(0)
首先,c++的内存分配地址有小到大分别是:动态内存区,包括栈和堆;代码内存区;静态内存区,包括全局变量,静态变量,只读变量(就是常量),按照定义的先后顺序分配地址;
本题中,p1,p2都是指针,是局部变量,在分配内存时会将其分配到栈区,且只会分配p本身所需要的内存空间,即p所指向的内容的地址大小的空间,并没有为字符串分配内存,所以*p1="123"和*p2="ABC"中 123和ABC都被分配在了文字常量区,既然是常量,大小就是不可变的,而strcat的第一个变量必须是可变的,所以程序会出错;
发表于 2017-03-29 11:37:12 回复(4)
strcat(p1,p2)出错,因为p1只被分配了4个字节的地址空间,将p2拼接在p1后面会引起内存溢出。
编辑于 2017-09-15 09:58:08 回复(4)
strcat(p1,p2)出错
#include<string.h>
int main()
{
 char*p1="123",*p2="ABC",str[50]="xyz"
 printf("str+2=%s\n",str+2);
 printf("strcat(p1,p2)=%s\n",strcat(p1,p2));
}
[luoyiran@luoyiran ~]$ ./zifuchuan 
str+2=z
段错误 (core dumped)




strac()代表函数接受两个字符串参数,它将第二个字符串的一份拷贝到第一个字符串的结尾,从而使第一个字符串成为一个新的组合字符串,第二个字符串没有改变,strcat()函数是char*类型,这个函数返回它的第一个参数的值,即其后添加了第二个字符串的那个字符串中第一个字符串的地址。

题目中第一个字符串是存放在rodata段的常量,不可被修改,所以出现段错误


编辑于 2018-08-11 18:53:56 回复(1)
 原型:extern char *strcat(char *dest,char *src);
        
  用法:#include <string.h>
  
  功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。
  
  说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
        返回指向dest的指针。
  p1指向内存空间为4个字节,不能将p2拼接在p1后面。
发表于 2016-05-07 22:07:32 回复(0)
常量字符串不能拼接
发表于 2021-03-23 07:55:39 回复(0)
首先,c++的内存分配地址有小到大分别是:动态内存区,包括栈和堆;代码内存区;静态内存区,包括全局变量,静态变量,只读变量(就是常量),按照定义的先后顺序分配地址;
本题中,p1,p2都是指针,是局部变量,在分配内存时会将其分配到栈区,且只会分配p本身所需要的内存空间,即p所指向的内容的地址大小的空间,并没有为字符串分配内存,所以*p1="123"和*p2="ABC"中 123和ABC都被分配在了文字常量区,既然是常量,大小就是不可变的,而strcat的第一个变量必须是可变的,所以程序会出错;


发表于 2018-06-06 17:03:40 回复(0)
char *p1= “123”, *p2 = “ABC”;
strcat(p1,p2);
p1是只读的,没有空间存放p2
发表于 2016-01-09 11:30:34 回复(0)
a和 b都存储在常量区,没办法cat。会发生错误

发表于 2020-07-25 14:46:58 回复(0)
p1和p2指向代码区,代码区不能随意改变。
发表于 2015-10-12 08:45:27 回复(0)

1.在 C++ 代码中,变量是强类型的, char * p1 = "123", * p2 = "ABC";会编译报错。
2.在 C 代码中,char * p1 = "123", * p2 = "ABC"; 是可以编译通过的,由于 p1, p2 都是指向文字常量区(本质上p1和p2存储的是字符串的首字符地址),常量区中的数据不能被修改,通过strcat(p1, p2)向p1指向的常量区数据追加(修改)内容,显然是错误的。
3.此外,
对于 C++ 而言,char* strcat(char ,const char),传参p2时参数类型不兼容,所以通过strcat(p1, p2)会报错。
char* 形参可以接收 char* 和const char* 类型的参数。
const char* 形参只能接收,const char* 类型的参数。
对于 C 而言,const char* 形参也可以接收char, const char 类型的参数。

发表于 2022-11-24 21:46:28 回复(0)

貌似大家都在关注strcat(p1,p2)的错误,当然这里strcat的用法是错误的,strcat的第一个变量必须是可变的。还有一个错误就是char str[50]= "xyz";"xyz"是const char*类型,不能用于初始化char类型的实体!

编辑于 2018-01-18 20:56:09 回复(2)
首先,c++的内存分配地址有小到大分别是:动态内存区,包括栈和堆;代码内存区;静态内存区,包括全局变量,静态变量,只读变量(就是常量),按照定义的先后顺序分配地址; 本题中,p1,p2都是指针,是局部变量,在分配内存时会将其分配到栈区,且只会分配p本身所需要的内存空间,即p所指向的内容的地址大小的空间,并没有为字符串分配内存,所以*p1="123"和*p2="ABC"中 123和ABC都被分配在了文字常量区,既然是常量,大小就是不可变的,而strcat的第一个变量必须是可变的,所以程序会出错;
发表于 2017-12-23 21:52:57 回复(0)
第二段代码写法就有问题吧,在vs2012和15上直接提示未定义
发表于 2016-09-19 15:01:23 回复(0)
p1.p2指针指向的是常量字符串区,无法完成字符串的拼接。一定要注意理解。
发表于 2016-05-26 21:47:20 回复(1)


发表于 2020-03-04 21:50:44 回复(0)

p1指向的常量,不可修改,所以不能通过strcat修改


发表于 2019-07-08 09:44:33 回复(0)
常量存储器,不能修改
发表于 2018-05-07 19:43:12 回复(0)
不知道有好多人 粗心了。常量区的字符串不可改变!
发表于 2018-01-05 19:43:55 回复(0)