为什么在循环中不能更改指针的内容?

我得到了一个字符串,我需要显示所有可以形成的字符串,一次删除一个字母。 例如,对于“ 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赋值?

shaliang8 回答:为什么在循环中不能更改指针的内容?

要根据您的描述输出字符串的子字符串,无需更改原始字符串。

此电话

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

大家都在问