首页 > 试题广场 >

下面的程序的输出是什么?

[单选题]
下面的程序的输出是什么?
#include<stdio.h>
#include<string.h>
int main(void){
 int n;
 char y[10] = "ntse";
 char *x = y;
 n = strlen(x);
 *x = x[n];
 x++;
 printf("x=%s,", x);
 printf("y=%s\n", y);
 return 0;
}


  • x=atse,y=
  • x=tse,y=
  • x=atse,y=e
  • x=tse,y=e
推荐
答案:选B
答案解析:n = strlen(x),此时n=4,因为x指向y数组,所以x[4]就是y[4]='\0',那么*x=x[n]就是把x指向的字符串首元素改为'\0',x++之后x指向第二个字符t,所以第一个输出x=tse,而y遇到第一个字符就是'\0',所以结束,y输出为空
编辑于 2015-02-03 14:25:29 回复(3)
重点在*x=x[n],n=4很好理解,*x指向数组y的首地址,*x=x[n]的意思就是把y的首地址换成y中的第5个元素( x[4]=y[4]).所以原数组变为 /0tse/0”。
发表于 2016-09-12 21:40:30 回复(2)

发表于 2018-10-04 11:53:50 回复(6)
*x=y,x和y指向同一块首地址,n = strlen(x),此时n=4,因为x指向y数组,所以x[4]就是y[4]='\0',那么*x=x[n]就是把x指向的字符串首元素改为'\0',x++之后x指向第二个字符t,所以第一个输出x=tse,而y遇到第一个字符就是'\0',printf遇“\0”终止,所以结束,y输出为空
发表于 2019-08-19 23:12:14 回复(0)
char y[10] = "ntse";//字符串长度是4,但是有第5个元素\0 
 char *x = y;//数组y的首地址给下 
 n = strlen(x);//长度4
 *x = x[n];//x[4]="\0",x的首地址内存的值改变成"\0" 
 x++;//x的地址+1 printf("x=%s,", x);//地址加1后""tse"
 printf("y=%s\n", y);//因为x,y都是一个地址,前面已经改变了地址内的值了"\0tse\0",字符串遇到"\0"结束,所以什么都不会打印
编辑于 2022-10-10 15:37:31 回复(1)
*x = x[n];
关键这句理解,x是数组,退化为x数组的首元素指针,加*,变成x首元素,这局就是让首元素=\0
发表于 2016-11-03 17:16:43 回复(2)
1:*x = x[n]; x[4]是第5个元素"\0"(x[0]"n"/x[1]"t"/x[2]"s"/x[3]"e"/x[4]"\0")
2:首先我们分析可知n = 4,而现在x指针指向y数组的头部,即指向y[0];
3:那么x[n]我们知道字符串数组以'\0'做结尾标记,故x[n] = '\0'; 所以*x =‘\0’;即y[0] = '\0';
4: 此时x++后,x指向y[1]的地址,故输出x的值为:tse;
5:那么y数组在内存中的内容为“\0tse”;所以输出y则肯定为空!!!
发表于 2017-07-11 16:21:10 回复(0)
答案:选B
答案解析:内存存储位置依次为/0tse/0;
发表于 2015-08-08 11:23:18 回复(0)
发表于 2019-08-05 15:05:59 回复(0)
这是在32位机器上的调试结果:
发表于 2017-03-22 16:51:50 回复(1)
对*x进行操作是更改x指针指向的位置; 对x进行操作是更改变量x本身。
发表于 2023-05-01 20:12:48 回复(0)
颛头像
这道题目是错误的,编译的时候错误,因为程序里面有strlen(),需要加上头文件 string.h 等,没有添加便编译不过去
发表于 2018-08-06 09:00:24 回复(0)
这段程序首先声明了一个整型变量n和一个字符数组y,然后将字符数组y的地址赋给指针变量x。然后使用strlen函数计算出x指向的字符串的长度,即4,然后将x指向的字符数组的第5个元素(即'\0')赋给*x,接着将指针x向后移动一个位置。最后,程序打印出x和y的值。

具体来说,程序的输出是x=tse, y=。这是因为在执行*x = x[n]时,将x指向的字符串的第一个元素改为了'\0',所以x指向的字符串变成了空字符串。而y数组在遇到第一个字符'\0'后就结束了,所以y的输出也为空。

因此,程序的输出结果是x=tse, y=。
发表于 2023-11-30 19:48:29 回复(0)
#include<stdio.h>
#include<string.h>
int main(void){
 int n;
 char y[10] = "ntse";
 char *x = y;
 n = strlen(x);
 *x = x[n];
 x++;
 printf("x=%s,", x);
 printf("y=%s\n", y);
 return 0;
}

解析:①n = strlen(x),此时n=4,因为x指向y数组,所以x[4]就是y[4]='\0'
②*x=x[n]就是把x指向的字符串首元素改为'\0'
③x++之后x指向第二个字符t,所以第一个输出x=tse,而y遇到第一个字符就是'\0',所以结束,y输出为空 

发表于 2022-10-17 17:18:20 回复(1)
字符串数组最后有一个反斜杠0
发表于 2021-02-16 09:00:20 回复(0)
unsigned int strlen(char *s);
变成了  \0tse\0   printf遇到\0输出为空
编辑于 2023-07-24 04:09:39 回复(0)

选B,从代码角度逐行分析。

 char y[10] = "ntse"; 
 char *x = y;
 n = strlen(x); // 字符数组y的长度
 *x = x[n]; // 修改指向的值,即修改 y[0]的值,x[4]等价于 y[4] = '\0',所以此时 y[10] = "\0tse"
 x++; // x指向 &y[1]

 printf("x=%s,", x); // 输出字符串,从y[1]开始,即 tse
 printf("y=%s\n", y); // 因为y[0]='\0',所以输出结束,为空输出
编辑于 2022-07-27 15:18:51 回复(0)
<p>*x=x(n)这一句改变的是指针x指向的数组的首元素 而非x 所以x是不变的 x++就变成了指向第二个元素</p><p>print遇到/n就会输出 所以y输出是空的</p><p><br></p>
发表于 2020-08-03 11:35:41 回复(0)
自己的分析过程:
char  *x=y; 表示指针x 指向数组y的起始地址(应该可以说成 相当于以后的 x(指针)和y的数组是等价的
n=strlen(x); 则通过x 计算x 数组的长度(也就是说是y数组的长度)
*x=x[n];相当于指针变量赋值为x[n]的整个数组
x++ (由于数组连续存储 因此x++ 相当于指向了数组的第1位元素)
因此当输出x 指针时直接从数组下标为1的" t "开始依次输出 即tse;
关于Y的输出后续更新(由于自己对指针也不是很理解,所以希望同仁看到我的理解错误疏漏的地方及时指正,谢谢大家)

发表于 2018-11-08 22:11:08 回复(0)
在DEV中运行结果是 tse ntse
发表于 2017-06-02 09:32:37 回复(0)
y[0]='\0'
发表于 2016-07-18 21:34:38 回复(0)