【问题标题】:How to print out a string that is pointed to by a char pointer?如何打印出由 char 指针指向的字符串?
【发布时间】:2014-11-24 12:36:42
【问题描述】:

我有这个程序打算测试两件事:

  1. 一旦分配,一个字符串就不能再分配给另一个字符串。
  2. 但是,两个 char 指针可以指向同一个字符串。

// 程序-

#include <stdio.h> 
#include <string.h>
int main(int argc, char const *argv[])
{
    char str[]="hello";
    char str2[10];
    int i=0;
    char *s="Good";
    char *p;

    //error
    //str=str2;
    printf("String str2: %s\n", str);
    //no error
    p=s;
    //printf("String pointed to by p: %s\n", *p );
    while(*s!='\0')
    {
        printf("%c", s[i]);
        s++;
        i++;

    }
    printf("\n");
    return 0;
}

当我打印出内容“Good”时,我得到了一个垃圾值。其他任何词都一样。 while 循环中出现问题了吗?

【问题讨论】:

  • s++; i++; 移动重复。删除i++;
  • 为什么需要char *p
  • 不相关,但你有一些未使用的变量

标签: c string pointers char


【解决方案1】:

增加数组索引和指针s:在第一次迭代期间,i == 0s 指向字符串Good 中的G。在第二次迭代中,s 指向第一个oi == 1,所以s[i] 是第二个o,这可能不是你想要的。

如果您注释掉i++,一切都会按预期进行:http://ideone.com/7zUOfM

【讨论】:

  • 感谢您的解释。尽管代码可以删除 i++,但我不确定我是否完全理解。就像你说的,在第一次迭代中,i 为零,s 指向字符“G”。在第二次迭代中,i 为 1,因此 s[1] 应该指向字符“O”——表示第一个 O,因为它是字符串中的第二个元素。那么,为什么它指向第三个元素,即:第二个“O”?它看起来与使用整数/浮点的指针算术不同!
  • 因为将s 递增到s++,会将指针s 向右移动一个字符。事实上,对于任何指针,*(s + i)s[i] 都是等价的。
【解决方案2】:

在这个循环中

while(*s!='\0')
{
    printf("%c", s[i]);
    s++;
    i++;

}

您正在同时增加索引i

    i++;

以及指向字符串字面量的指针

    s++;

所以这会导致一些垃圾,因为 s[i] 对于一些 is 在它们递增之后将访问超出字符串文字的内存。

您应该只增加索引 i 或相应的指针。例如你可以简单地写

while ( *p ) printf( "%c", *p++ );

【讨论】:

  • 谢谢!您的最后一行代码非常容易理解!
  • @Manish 我认为越简单的代码越容易理解。:)
猜你喜欢
  • 1970-01-01
  • 2021-03-27
  • 2015-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 2021-12-05
相关资源
最近更新 更多