要根据您的描述输出字符串的子字符串,无需更改原始字符串。
此电话
strcpy(p+i,p+i+1);
具有1)未定义的行为(因为范围重叠)2)并更改了原始字符串。
此电话
strcpy(p,s);
没有意义,因为由于此分配,字符串已被复制到自身中
p=s;
可以使用普通的for循环完成任务。例如(一个C ++程序)
#include <iostream>
int main()
{
const char *s = "abbc";
for ( size_t i = 0; s[i] != '\0'; i++ )
{
for ( size_t j = 0; s[j] != '\0'; j++ )
{
if ( j != i ) std::cout << s[j];
}
std::cout << '\n';
}
return 0;
}
程序输出为
bbc
abc
abc
abb
或(一个C程序)
#include <stdio.h>
int main(void)
{
const char *s = "abbc";
for ( size_t i = 0; s[i] != '\0'; i++ )
{
for ( size_t j = 0; s[j] != '\0'; j++ )
{
if ( j != i ) putchar( s[j] );
}
putchar( '\n' );
}
return 0;
}
,
这里是纯C版本。它从字符串中删除最后一个字符并进行存储。之后,它将每个字符替换为之后的字符,直到所有字符都被替换为止。最后,字符串将包含从第二个字符开始的子字符串。
#include <string.h>
#include <stdio.h>
int main()
{
char s[41] = "abbc";
int n;
char c,tmp;
n = strlen(s);
c = 0;
while( n > 0 )
{
n--;
tmp = c;
c = s[n];
s[n] = tmp;
printf( "%s\n",s );
}
return 0;
}
,
p和s指向相同的内存。每次循环都会修改内存,因此在第一个循环之后,n不再是字符串的长度。
循环1:p&s =“ abbc”,i = 0,n = 4
p + 0指向“ abbc”,p + 1指向“ bbc”
strcpy(p + 0,P + 1)之后s的值为“ bbc”
循环2:p&s =“ bbc”,i = 1,n = 4
p + 1指向“ bc”,p + 1 + 1指向“ c”
strcpy(p + 1,P + 2)之后s的值为“ bc”
循环3:p&s =“ bc”,i = 2,n = 4
p + 2指向null或“”,p + 3指向字符串后的内容
strcpy(p + 2,p + 3)之后的s值未定义,但可能仍为“ bc”
循环4:由于您现在不在弦上,因此从上面没有真正的改变
本文链接:https://www.f2er.com/3066841.html