C++中给字符数组赋值报错,求解

赤练仙子_ 2016-05-23 01:58:43
一道编程题,替换空格
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
我的代码
#include <iostream>
#include <string>

using namespace std;

int main()
{
char *str = "We Are Happy";
int i = 0, j, length = 12;
while (str[i] != '\0')
{
if (str[i] == ' ')
{
length += 2;
for (j = length - 3; j > i; j--)
str[j + 2] = str[j];
str[i] = '%';
str[i + 1] = '2';
str[i + 2] = '0';
}
++i;
}
cout << str << endl;


system("pause");
return 0;
}


程序在网站上测试通过,但在vs2013上运行到str[j+2]=str[j]这行报错,字符数组不能赋值,求解
...全文
435 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赤练仙子_ 2016-05-25
  • 打赏
  • 举报
回复
引用 6 楼 paschen 的回复:
[quote=引用 5 楼 lonely1206 的回复:] [quote=引用 2 楼 paschen 的回复:] char *str = "We Are Happy";是在常量区的字符串,不能进行修改,这句改成:char str[] = "We Are Happy"; 另外,由于你向后移动了字符串,要在最后补充上\0
改成char str[]之后可以赋值了,但最后补充上\0运行报错,运行到str[j + 3] = '\0';这行报错,说缓冲区溢出,为什么呢?不补\0的话后面就是垃圾值了
#include <iostream>
#include <string>

using namespace std;

int main()
{
	char str[] = "We Are Happy";
	int i = 0, j, length = 12;
	while (str[i] != '\0')
	{
		if (str[i] == ' ')
		{
			length += 2;
			for (j = length - 3; j > i; j--)
			{
				str[j + 2] = str[j];
				str[j + 3] = '\0';
			}
				
			str[i] = '%';
			str[i + 1] = '2';
			str[i + 2] = '0';
		}
		++i;
	}
	cout << str << endl;
	
	
	system("pause");
	return 0;
}

[/quote] 其实应该改成: char str[100] = "We Are Happy"; 也就是说多留出一些空间,因为你要往后移动[/quote]知道了,谢谢版主
paschen 版主 2016-05-24
  • 打赏
  • 举报
回复
引用 5 楼 lonely1206 的回复:
[quote=引用 2 楼 paschen 的回复:] char *str = "We Are Happy";是在常量区的字符串,不能进行修改,这句改成:char str[] = "We Are Happy"; 另外,由于你向后移动了字符串,要在最后补充上\0
改成char str[]之后可以赋值了,但最后补充上\0运行报错,运行到str[j + 3] = '\0';这行报错,说缓冲区溢出,为什么呢?不补\0的话后面就是垃圾值了
#include <iostream>
#include <string>

using namespace std;

int main()
{
	char str[] = "We Are Happy";
	int i = 0, j, length = 12;
	while (str[i] != '\0')
	{
		if (str[i] == ' ')
		{
			length += 2;
			for (j = length - 3; j > i; j--)
			{
				str[j + 2] = str[j];
				str[j + 3] = '\0';
			}
				
			str[i] = '%';
			str[i + 1] = '2';
			str[i + 2] = '0';
		}
		++i;
	}
	cout << str << endl;
	
	
	system("pause");
	return 0;
}

[/quote] 其实应该改成: char str[100] = "We Are Happy"; 也就是说多留出一些空间,因为你要往后移动
赤练仙子_ 2016-05-24
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
char *str = "We Are Happy";是在常量区的字符串,不能进行修改,这句改成:char str[] = "We Are Happy";

另外,由于你向后移动了字符串,要在最后补充上\0

改成char str[]之后可以赋值了,但最后补充上\0运行报错,运行到str[j + 3] = '\0';这行报错,说缓冲区溢出,为什么呢?不补\0的话后面就是垃圾值了
#include <iostream>
#include <string>

using namespace std;

int main()
{
char str[] = "We Are Happy";
int i = 0, j, length = 12;
while (str[i] != '\0')
{
if (str[i] == ' ')
{
length += 2;
for (j = length - 3; j > i; j--)
{
str[j + 2] = str[j];
str[j + 3] = '\0';
}

str[i] = '%';
str[i + 1] = '2';
str[i + 2] = '0';
}
++i;
}
cout << str << endl;


system("pause");
return 0;
}


小灸舞 2016-05-23
  • 打赏
  • 举报
回复
VS下把"We Are Happy"这样的常量字符串放在常量区,该区域不允许进行写操作
你网站上的编译器我猜肯定是GCC

单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
paschen 版主 2016-05-23
  • 打赏
  • 举报
回复
char *str = "We Are Happy";是在常量区的字符串,不能进行修改,这句改成:char str[] = "We Are Happy"; 另外,由于你向后移动了字符串,要在最后补充上\0
lqbk1 2016-05-23
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>

using namespace std;

int main()
{
	char *str = "We Are Happy";
	string strdst;
	int i = 0, length = 12;
	while (str[i] != '\0')
	{
		if (str[i] == ' '){
			strdst+="%20";
		}
		else{
			strdst += str[i];
		}
		++i;
	}
	cout << strdst << endl;

	system("pause");
	return 0;
}
赵4老师 2016-05-23
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <string.h>
char s[256];
char *p;
int r,n,i;
int main() {
    while (1) {
        printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");
        fgets(s,256,stdin);
        if ('\n'==s[0]) break;
        p=s;
        while (1) {
            p=strstr(p,"%20");
            if (p) {
                memmove(p+1,p+3,strlen(p)-3+1);
                p[0]=' ';
            } else break;
        }
        p=s;
        while (1) {
            p=strstr(p,"你懂得");
            if (p) {
                memmove(p+6,p+6,strlen(p)-6+1);
                for (i=0;i<6;i++) p[i]='X';
            } else break;
        }
        printf("%s",s);
    }
    return 0;
}
//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX":
//abcdefg%20helloworld%20something.pdf
//abcdefg helloworld something.pdf
//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX":
//这是测试文字你懂得,在这个你懂的地方,就得做你懂得的事
//这是测试文字XXXXX,在这个你懂的地方,就得做XXXXX的事
//请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX":
//


65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧