我试图弄清楚为什么这不起作用:
#include <stdio.h>
int main ()
{
char *orig = "Hey you guys.";
char *str;
str = &orig;
while(*str++) {
if (*str == 'y')
*str = '@';
}
puts(orig);
return 0;
}
// OUTPUT => "Hey you guys."
// Not "he@ @ou gu@s." as expected.
通过分配str =&amp; orig,我认为str将与orig共享相同的内存地址。 我错过了什么?
答案 0 :(得分:2)
两件事:
&orig
是指针的地址。也许你想要str = orig
。你的编译器应该在这里警告你指针类型不匹配;如果没有,则调高警告级别直到它出现。char orig[] = "Hey you guys."
将文字字符串复制到一个名为orig
的数组中,您可以安全地修改它。答案 1 :(得分:2)
(1)用于共享您想要执行的内存str = orig
,因为str
已经是指针类型。
(2)orig
被定义为字符串文字,常量 - 所以你不能修改值"Hey you guys."
,即使不是通过str
访问时,会导致运行时错误。
编辑:问题#3:在你的while循环中,首先增加指针,然后检查它是否为'y'并进行修改。通过这样做 - 你会错过第一个元素。如您所料,"yasdf"
将变为"yasdf"
而非"@asdf"
。 [我认为无论如何你想要的......]
要实现您的目标,您可以遵循以下步骤:[使用strcpy和缓冲区,以避免写入常量内存]
#include <stdio.h>
#include <string.h>
int main ()
{
char *orig = "Hey you guys.";
char buff[14]; //the length of orig + 1 byte for '\0'
char *str = buff; //since str and buff are already pointers
strcpy(str,orig);
while(*str) {
if (*str == 'y')
*str = '@';
str++;
}
puts(buff);
return 0;
}
答案 2 :(得分:0)
#include <stdio.h> int main () { char orig[] = "Hey you guys."; char *str; str = orig; int i; while(*str){ if (*str == 'y') *str = '@'; *str++; } puts(str); puts(orig); return 0; }