【问题标题】:Why can't I change the pointer's content when in a loop?为什么我不能在循环中更改指针的内容?
【发布时间】:2019-11-20 10:24:32
【问题描述】:

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

【问题讨论】:

  • 这不是C++。除了一行(cout&lt;&lt;p&lt;&lt;" ";)之外,这是纯粹的CLink for your teacher.
  • p 和 s 指向同一个内存,所以在第一个循环之后 n 不再有效..不知道为什么你会期待不同的东西?
  • 你实际上并没有复制sp 只是指向同一个原始字符串,所以对p 的所有操作都会修改s。您想要制作字符串的实际(深层)副本。
  • 这能回答你的问题吗? Make a copy of a char*

标签: c++ loops pointers c-strings


【解决方案1】:

要根据你的描述输出一个字符串的子字符串,不需要改变原来的字符串。

这个电话

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;
}

【讨论】:

    【解决方案2】:

    这是一个纯 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;
    }
    

    【讨论】:

      【解决方案3】:

      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:从上面没有真正改变,因为你现在在字符串之外

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-30
        • 2021-02-07
        • 1970-01-01
        相关资源
        最近更新 更多