我得到了一个字符串,我需要显示所有可以形成的字符串,一次删除一个字母。 例如,对于“ abbc”,我应该显示“ bbc” “ abc” “ abc” 和“ abb” 这是我的代码:
int main()
{
char s[41]="abbc",*p;
int n=strlen(s);
p=s;
int i=0;
while(i<n)
{
strcpy(p+i,p+i+1);
cout<<p<<" ";
i++;
strcpy(p,s);
}
return 0;
}
它一直显示 bbc bc bc bc ,好像没有写strcpy(p,s);
一样。为什么不能循环给pointer p
赋值?
答案 0 :(得分:0)
要根据您的描述输出字符串的子字符串,无需更改原始字符串。
此电话
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;
}
答案 1 :(得分: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;
}
答案 2 :(得分:-1)
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:由于您现在不在弦上,因此从上面没有真正的改变