Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何混响c风格字符串_C++_String - Fatal编程技术网

C++ 如何混响c风格字符串

C++ 如何混响c风格字符串,c++,string,C++,String,我想反转一个c样式的字符串,并得出以下代码 #包括 无效反向_c_str(字符*c) { char*new_c=c; 对于(;*new_c;++new_c){}//查找'\0' --new_c;//new_c现在是实际的最后一个字符,即“g” while(c

我想反转一个c样式的字符串,并得出以下代码

#包括
无效反向_c_str(字符*c)
{
char*new_c=c;
对于(;*new_c;++new_c){}//查找'\0'
--new_c;//new_c现在是实际的最后一个字符,即“g”
while(c“我的字符串”
是一个字符串文本,它是
const

出于与C兼容的原因,可以将其强制转换为非常量
char*
,但修改常量会调用它。在某些情况下,操作系统会阻止它(如将其存储在只读部分中),这可能就是您观察到的情况

在自动存储中复制字符串,然后可以修改它:

int main()
{
    char c[] { "my string" };
    reverse_c_str(c);
    std::cout << c << '\n';
}
intmain()
{
字符c[]{“我的字符串”};
反向_c_str(c);

std::cout当然还有一个模板化的解决方案:

#include <cstring>

template<std::size_t N>
void reverse_c_str(char (&str)[N]) {
    std::size_t len = N-1;
    for (std::size_t i = 0; i < len/2; ++i) {
        str[i] ^= str[len-i-1];
        str[len-i-1] ^= str[i];
        str[i] ^= str[len-i-1];
    }
}

int main() {
    char c[] {"123"};
    reverse_c_str(c);

    char c2[] {""};
    reverse_c_str(c2);

    char c3[] {"4321"};
    reverse_c_str(c3);

    return 0;
}
#包括
模板
无效反向字符(字符(&str)[N]){
标准:尺寸长度=N-1;
对于(标准::尺寸i=0;i
使用和。我为你树立了榜样

#包括
#包括
无效反向_c_str(字符*c){
int length=std::strlen(c);
对于(int i=0;iSTD:CUD> CAR*C**=“我的字符串”;不应编译在C++中,字符串文字是<代码> const char */Cord>,并且不允许修改it@UnholySheep它不应该这样做,但不幸的是,即使有了
-pedantic
,它也是“唯一的”警告。尽管字符串文本到
char*
的转换在C++98中被弃用,在C++11(从内存)中被禁止,但仍有大量代码“处于野生状态”因此,编译器供应商持续承受着继续允许转换的压力。对于大多数编译器供应商来说,阻力最小的途径是允许转换并发出警告。如果您真的希望获得转换,并且您的编译器允许,请将警告视为错误。@t.niese是正确的。战争IN是警告:ISO C++禁止将字符串常量转换为'char * '-WWORD字符串
@User12547645澄清一下,错误是语法错误。但是警告不仅仅是可以忽略的,编译器会告诉您运行时可能会出错。每当您看到编译器发出的警告时,您都应该修复该警告。非常感谢您的回复。我真的很困惑,我的代码没有不起作用,但仍然可以编译。@User12547645出于某种非常奇怪的原因,许多人似乎认为编译的代码是自动正确的代码。最好尽早消除这种误解,因为它只会给你带来痛苦。
#include <cstring>

template<std::size_t N>
void reverse_c_str(char (&str)[N]) {
    std::size_t len = N-1;
    for (std::size_t i = 0; i < len/2; ++i) {
        str[i] ^= str[len-i-1];
        str[len-i-1] ^= str[i];
        str[i] ^= str[len-i-1];
    }
}

int main() {
    char c[] {"123"};
    reverse_c_str(c);

    char c2[] {""};
    reverse_c_str(c2);

    char c3[] {"4321"};
    reverse_c_str(c3);

    return 0;
}
#include <iostream>
#include <cstring>

void reverse_c_str(char *c) {
    int length = std::strlen(c);
    for (int i = 0; i < length / 2; i++)
        std::swap(c[i], c[length - i - 1]);
}

int main()
{
    char c[] { "my string" };
    reverse_c_str(c);
    std::cout<<c << std::endl;
    return 0;
}

Output:
gnirts ym
void reverse_c_str(char *c) {
    if(*c) {
        for(auto begin = c, end = c + std::strlen(c) - 1; 
            begin < end; ++begin, --end
            ) {
            std::swap(*begin, *end);
        }
    }
}