使用指针交换两个字符串会输出奇怪的输出

Exchanging two strings using pointers prints strange output

本文关键字:输出 字符串 两个 指针 交换      更新时间:2023-10-16

我编写了一个程序,使用指针交换两个字符串。

char *names[]={"Sachin","Kapil","Ajay","Sunil","Anil"};
cout<<"String II is ";cout<<names[1];
cout<<"nString IV is ";cout<<names[3];
char *t;
t=names[1];
names[1]=names[3];
names[3]=t;
cout<<"nString II is ";cout<<names[1];
cout<<"nString IV is ";cout<<names[3];

在第一行中,我使用了一个char指针数组来存储字符串的第一个字符的地址。

当我计算名称[1]和名称[3]时:

打印了整个字符串,但是不应该只打印字符指针的地址吗?

还有,程序是如何打印整个字符串而不是单独打印第一个字符的?

编译后,我从第1行得到一个警告说:警告:从字符串常量到'char*'的转换已弃用[-Wwrite-strings]|

程序按预期运行,但我想知道它是如何工作的。我遇到了一个实现,他们使用count .write(names[I],len)来打印整个字符串(这是有意义的),但令我惊讶的是,上面的方法也能工作(即使没有任何增加指针值来打印下一个字符)。

对于以上所列问题的任何提示和建议都将不胜感激。谢谢你!

首先—为什么不直接得到地址输出?当您将任何char* '插入'到流中,例如std::cout<<s;,其中schar*类型,插入逻辑假设s指向'C'字符串的第一个字符。'C'字符串是以null (''字符)结尾的一系列字符。因此插入逻辑输出这一系列字符。

如果你使用std::cout<<static_cast<void*>(c);,你会得到不同的结果,因为void*指针的插入是不同的。

流上的<<操作符被重载,可以根据插入的内容做不同的事情。

为什么会出现这个警告。您正在揭示c++的一些令人不快的遗留问题,特别是从C继承的包袱。在没有const修饰符的早期C语言的糟糕日子里,没有办法指示字符串字面值(例如:"Sachin")不能在运行时修改,在不同的平台上这样做会产生不同的影响,从无害地修改数据,抛出访问异常到修改代码中对该字符串值的所有文字引用(可能有几个)。

因此,当c++出现并引入const(很快又被C采用)时,在代码const char[]中创建字符串字面值的类型是非常合适的。然而,有些编译器(当您有错误的设置!)仍然允许您为char[](或char*)分配文字以向后兼容。除非你在维护古老的代码,并且高级程序员已经指示你永远不要让这个选项处于启用状态。

流库识别char*类型并将其视为以null结尾的c风格字符串,该字符串只是一个以null结尾的字符数组。

要让它打印地址,请将字符串强制转换为void*。

cout << "String II is "; cout << (void *)names[1];

现在将输出:

String II is 0x400a0b
至于为什么不打印第一个字符,这是因为流库将其视为以空结束的C字符串。但是如果你真的只想打印第一个字符,你可以这样做:
cout << "String II is "; cout << *names[1];

或:

cout << "String II is "; cout << names[1][0];

像你这样操作指针是可以的,但是当你声明它们时,就不能操作它们所包含的内容了。你应该声明它们为const。这也消除了编译警告。因此代码将变成。

const char *names[]={"Sachin","Kapil","Ajay","Sunil","Anil"};
cout << "nString II is "; cout << (void*)names[1];
cout << "nString IV is "; cout << (void*)names[3];
const char *t;
t = names[1];
names[1] = names[3];
names[3] = t;
cout << "nString II is "; cout <<(void*)names[1];
cout << "nString IV is "; cout <<(void*)names[3];