void move(char *arr,int k,int len)
{
for(int i=0;i<k;i++)
{
int tmp=*arr;
int j=0;
for(j=0;j<len-1;j++)
{
*(arr+j)=*(arr+j+1);
}
*(arr+len-1)=tmp;//能不能写成*(arr+j+1)=tmp,为什么此时*(arr+j+1)的值为0
}
}
int main()
{
char arr[]="abcdef";
int k=1;
int len=strlen(arr);
// scanf("%s",&k);
move(arr,k,len);
printf("%s",arr);
return 0;
return 0;
}
*(arr+len-1)=tmp;
(arr+len-1)为什么不能换成(arr+j+1)
【以下回答由 GPT 生成】
问题的关键在于循环的控制条件和变量j
的使用。
在函数内部的第二个循环中,循环的控制条件是j<len-1
,这意味着j
的取值范围是从0到len-2
。循环体中的语句*(arr+j)=*(arr+j+1)
是将当前位置的元素替换为下一个位置的元素,这是正确的。
然而,如果将*(arr+len-1)
替换为*(arr+j+1)
,就会出现问题。因为在循环结束后,变量j
的值是len-1
,而数组的下标范围是从0到len-1
,所以*(arr+len-1)
就会超出数组的范围,访问到无效的内存位置。这样的行为是未定义的,可能会导致程序崩溃或产生其他错误结果。
此外,你提到“此时*(arr+j+1)
的值为0”,这可能是因为在数组arr
最后一个位置存储的是空字符('\0'),而空字符在C语言中表示字符串的结束。所以你看到的是空字符的ASCII码值0。这并不是*(arr+j+1)
的真正值,将其替换到数组中可能会导致错误的结果。
总结起来,保持*(arr+len-1)
不变是正确的做法,将其替换为*(arr+j+1)
会导致访问无效内存并可能引发错误。
for的最后一次循环时先j++,然后检测j发现不小于len,所以现在j=len-1,那么就应该是*(arr+j)