我有这个程序打算测试两件事:
// Program-
#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循环中出了什么问题?
答案 0 :(得分:2)
增加数组索引和指针s
:在第一次迭代期间,i == 0
和s
指向字符串G
中的Good
。在第二次迭代中,s
指向第一个o
和i == 1
,因此s[i]
是第二个o
,这可能不是您想要的。< / p>
如果您对i++
发表评论,那么一切都会按预期发挥作用:http://ideone.com/7zUOfM
答案 1 :(得分:2)
在这个循环中
while(*s!='\0')
{
printf("%c", s[i]);
s++;
i++;
}
您正在同时递增索引i
i++;
和指向字符串文字的指针
s++;
因此,这会产生一些垃圾,因为s[i]
i
和s
递增后会访问字符串文字以外的内存。
您应该只增加索引i或相应的指针。例如,您可以简单地写
while ( *p ) printf( "%c", *p++ );