编写一个程序来反转存储在以下字符串指针数组中的字符串:
char *s[ ] = {
"To err is human...",
"But to really mess things up...",
"One needs to know C!!"
};
提示:编写一个应该反转的函数
xstrrev ( string )
一个字符串的内容。调用此函数可以反转每个 存储在s
中的字符串。
为什么我没有使用此代码获得正确的输出?
#include "stdafx.h"
#include "conio.h"
#include "stdio.h"
#include "string.h"
using namespace System;
void xstrrev (char str[])
{
int i,l;
char temp;
l=strlen(str);
for (i=0;i<(l/2);++i)
{
temp=*(str+i);
*(str+i)=*(str+i+l-1);
*(str+i+l-1)=temp;
}
}
void main ()
{
char *s[] = {
"To err is human...",
"But to really mess things up...",
"One needs to know C!!"
};
xstrrev(s[0]);
xstrrev(s[1]);
xstrrev(s[2]);
puts(s[0]);
puts(s[1]);
puts(s[2]);
getch();
}
答案 0 :(得分:0)
在宣告s[]
时,我是否只能注意到你做错了。您应该在main()中声明s[]
,如下所示:
char str1[] = "To err is human...";
char str2[] = "But to really mess things up...";
char str3[] = "One needs to know C!!";
char *s[] = { str1, str2, str3};
原因:
如果您愿意:
char* str = "yourname";
str[2] = 'c'; // you are trying to write on read only memory
你试图在只读内存上写字。分段错误的原因(未定义的行为)因为str
指向一个常量字符串文字。
如果你愿意,可以在哪里:
char str[] = "yourname";
str[2] = 'c'; // ok no error
然后确定,因为这个时间str[]
是一个数组字符串,它的值和大小是在声明点定义的。
我认为算法明智,你是正确的
编辑,我是对的。看到你的代码在我的建议Codepad之后工作,@ carlNorm说的是正确的。他还发布了一个很好的链接。