2014-11-24 62 views
1

我有这个计划,旨在测试两件事情:如何打印出由char指针指向的字符串?

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

我得到一个垃圾值,当我打印出来的内容 “好”。任何其他词都一样。 while循环出错了吗?字符串Good在在第一次迭代,i == 0sG

+4

's ++;我++;'移动是重复的。删除'i ++;' – BLUEPIXY 2014-11-24 12:42:03

+0

你为什么需要'char * p'? – Gopi 2014-11-24 12:49:45

+0

无关,但您有一些未使用的变量 – 2014-11-24 14:30:47

回答

2

你增加两个数组的索引和指针s。在第二次迭代中,s指向第一个oi == 1,因此s[i]是第二个o,这可能不是您想要的。

如果您注释掉i++,一切都将工作打算:http://ideone.com/7zUOfM

+0

感谢您的解释。尽管代码适用于删除i ++,但我不确定自己完全理解。就像你说的,在第一次迭代中,我是零,并且s指向字符“G”。在第二次迭代中,i是1,所以s [1]应该指向字符“O” - 意味着第一个O,因为它是字符串中的第二个元素。那么,它为什么指向第三个元素,即:第二个“O”?它看起来不同于使用整数/浮点的指针运算! – 2014-11-25 05:54:26

+0

因为通过's ++'增加's',你将指针's'移动一个字符到右边。实际上,对于任何指针,'*(s + i)'和's [i]'是等价的。 – Phillip 2014-11-25 07:11:02

2

在这个循环中

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

} 

你同时递增指数i

i++; 

和指针字符串文字

s++; 

因此,这会导致一些垃圾,因为s[i]某些is增加后会访问超出字符串文字的内存。

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

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

谢谢!你的最后一行代码很容易理解! – 2014-11-25 05:55:01

+0

@管理我虽然简单的代码很容易理解它:) – 2014-11-25 05:58:48