我只是想编写一个用于反转char数组的代码(或指针char。我失败了,因此使用了char数组)。像“美国空军”将是“FAUS”首先我用指针这样做,所以我有访问违规。
代码:
#include <iostream>
using namespace std;
int getlength(char *);
void reverse (char * ch );
int main ()
{
char *ch ="USAF";
/*cout<<*ch;*/
int len = getlength(ch);
reverse(ch);
cout<<"Reverse :";
for(int i =0;i <len; i++)
cout<<*(ch + i);
cin.get();
}
int getlength(char * ch)
{
int len=0;
char *address = ch;
for(; *(ch)!='\0' ; ch++)
len++;
ch=address;
return len;
}
void reverse(char *ch )
{
char tmp;
int i,j,len=getlength(ch);
for(i=0;i<(len/2);i++)
for(j=len-1;j>(len/2);j--){
tmp=*(ch+i);
*(ch+i)=*(ch+j); //ACCESS VIOLATED
*(ch+j)=tmp;
}
为什么会这样? ch + i和+ j是char指针的长度(数组真的应该在什么时候调用它?)但它会抛出一个c?
并且我当前的代码几乎没有指针,但由于数组是以某种方式指针而且它们通过引用调用,所以我想我做到了:
#include <iostream>
using namespace std;
void reverse (char ch [],int len);
int main ()
{
char ch [] ="USAF";
int len = sizeof(ch);
reverse(ch,len);
cout<<"Reverse :";
for(int i =0;i <len; i++)
cout<<ch[i];
cin.get();
}
void reverse(char ch [],int len)
{
int i,j;
char tmp;
for(i=0;i<len;i++)
cout<<*(ch+i);
cout<<*(ch+(3-1));
for(i=0;i<(len/2);i++)
for(j=len-1 ; j>(len/2);j--){
tmp = ch[i];
ch[i]=ch[j];
ch[j]=tmp;
}
但是当我编译它时显示:“F AUS”从那个空白角色出现的地方看起来很奇怪? (有些cout线只是剩下的,不介意它们)
PS:这是我在stackoverflow中的第一篇文章(酷名btw :))。我非常喜欢这里的专业氛围,并且发现这是一个提出自己问题的好地方+当我获得大量知识回答别人时。
答案 0 :(得分:1)
变量ch
指向一个字符串文字,它是常量字符的数组。换句话说,尝试更改它将导致undefined behavior。
而是将其声明为数组,例如
char ch[] = "USAF";
然后编译器在堆栈上创建字符串并且它不是常量,因此您可以更改数组的内容。
答案 1 :(得分:0)
#include <iostream>
using namespace std;
int getlength(char *);
void reverse(char * ch);
int main()
{
char ch[] = "USAF";
/*cout<<*ch;*/
int len = getlength(ch);
reverse(ch);
cout << "Reverse :";
for (int i = 0; i < len; i++)
cout << *(ch + i);
cin.get();
}
int getlength(char * ch)
{
int len = 0;
char *address = ch;
for (; *(ch) != '\0'; ch++)
len++;
ch = address;
return len;
}
void reverse(char *ch)
{
int len = getlength(ch);
for (int i = 0; i < len / 2; i++) {
char c = ch[i];
ch[i] = ch[len - i - 1];
ch[len - i - 1] = c;
}
}