当前位置:  开发笔记 > 编程语言 > 正文

为什么我不能为指针赋值?

如何解决《为什么我不能为指针赋值?》经验,为你挑选了2个好方法。

在阅读了faq和我能找到的其他所有内容后,我仍然感到困惑.如果我有一个以这种方式初始化的char指针:

char *s = "Hello world!"

字符串在只读内存中,我无法像这样更改它:

*s = 'W';

制作"Wello世界!".我理解这一点,但对于我的生活,我不能理解如何使它不是只读的.我必须使用数组而不是指针吗?喜欢这里?

这是我的代码:

char *s = str;
char *e = s;
while (*e != '\0')
e++;
e--;
char *temp;
//Swop the string around
while (s <= e) {
    *temp = *s;
    *s = *e;
    *e = *temp;
    e--;
    s++;
}

错误消息只是一个分段错误.如果这是一个非常愚蠢的问题,请提前道歉.

非常感谢所有的帮助.在接受了你的所有建议后,我得到了这个:

void something(char * str) {
    char *store = str;
    char *s = new char[strlen(str) + 1]; //Allocate memory. Nice one.
    strcpy(s, str);
    char *e = new char[strlen(str) + 1];
    strcpy(e, str);
    while (*e != '\0')
        e++;
    e--;
    char temp; //no longer a pointer
    while (s <= e) {
        cout << *e;
        temp = *s;
        *s = *e;
        *e = temp;
        e--;
        s++;

    }
    delete [] e;
    delete [] s;        
}

但是,函数末尾的删除似乎导致了它们自己的分段错误.为什么?

为了感兴趣:故障是由于在增加后访问e和s指针.一个更简单的解决方案:

void something(char * str) {
    char *s = new char[strlen(str) + 1];
    strcpy(s, str);
    char temp;
    int j = strlen(str) - 1;
    for (int i = 0; i <= strlen(str)/2; i++) {
        cout << s << endl;
        temp = s[i];
        s[i] = s[j];
        s[j] = temp;
        j--;
    }
    delete [] s;
}

Martin York.. 7

尝试:

char src[] = "Hello world";
src[6]     = 'W';

-- // or

char   buffer[] = "Hello world";
char*  src      = buffer;
src[6]          = 'W';

如果要将字符串复制到缓冲区中,请使用strcpy()或strncpy()

char   buffer[20];
char const* s = "Hello World"

strcpy(s,buffer);

如果你必须编写自己的字符串副本,那么它应该如下所示:

char   buffer[20];
char const* s = "Hello World";

// OK this is not the perfect solution but it is easy to read.
for(int loop = 0;s[loop] != '\0';++loop)
{
    buffer[loop] = s[loop];
}
buffer[loop] = '\0';


Jesse Rusak.. 6

修改它的最简单方法是为存储创建一个数组,然后将字符串复制到其中.

例如:

char buf[128];
const char *src = "Hello World";
strncpy(buf, src, 127); // one less - we always 0-terminate
buf[127] = '\0';

// you can now modify buf
buf[0] = 'W';

您的代码不起作用的原因是您没有为字符串的副本分配任何内存 - 您刚刚创建了指向同一只读内存的第二个指针.(然后尝试复制它?我不太确定代码的其余部分是做什么的.)你需要在某处获得一些非只读内存,并且使用标准库将其复制到那个新的记忆,而不是自己写的循环.

如果你事先不知道字符串的长度,你也可以使用malloc(或者更好的是,做drschnz的答案并使用新的char []):

const char *src = "Hello world";
char *buf = malloc(strlen(src) + 1);   // or = new char[strlen(src) + 1];
strcpy(buf, src);
// you can now modify buf
// later, you need to free it
free(buf);                             // or delete [] buf;

此外,如果您使用的是C++,则可以使用std :: string:

std::string myString("Hello world");
myString[0] = "W";

希望有所帮助.



1> Martin York..:

尝试:

char src[] = "Hello world";
src[6]     = 'W';

-- // or

char   buffer[] = "Hello world";
char*  src      = buffer;
src[6]          = 'W';

如果要将字符串复制到缓冲区中,请使用strcpy()或strncpy()

char   buffer[20];
char const* s = "Hello World"

strcpy(s,buffer);

如果你必须编写自己的字符串副本,那么它应该如下所示:

char   buffer[20];
char const* s = "Hello World";

// OK this is not the perfect solution but it is easy to read.
for(int loop = 0;s[loop] != '\0';++loop)
{
    buffer[loop] = s[loop];
}
buffer[loop] = '\0';



2> Jesse Rusak..:

修改它的最简单方法是为存储创建一个数组,然后将字符串复制到其中.

例如:

char buf[128];
const char *src = "Hello World";
strncpy(buf, src, 127); // one less - we always 0-terminate
buf[127] = '\0';

// you can now modify buf
buf[0] = 'W';

您的代码不起作用的原因是您没有为字符串的副本分配任何内存 - 您刚刚创建了指向同一只读内存的第二个指针.(然后尝试复制它?我不太确定代码的其余部分是做什么的.)你需要在某处获得一些非只读内存,并且使用标准库将其复制到那个新的记忆,而不是自己写的循环.

如果你事先不知道字符串的长度,你也可以使用malloc(或者更好的是,做drschnz的答案并使用新的char []):

const char *src = "Hello world";
char *buf = malloc(strlen(src) + 1);   // or = new char[strlen(src) + 1];
strcpy(buf, src);
// you can now modify buf
// later, you need to free it
free(buf);                             // or delete [] buf;

此外,如果您使用的是C++,则可以使用std :: string:

std::string myString("Hello world");
myString[0] = "W";

希望有所帮助.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有