从字符串常量转换,c ++

时间:2016-02-09 10:50:34

标签: c++ pointers char

在阅读了几个答案后,我已将代码更正为:

int main()
{
    // a pointer to char is initialized with a string literal

    char Buffer[100];

    cout << "Enter an initial string: " << endl;
    cin >> Buffer;
    cout << "Original content of Buffer:--> " << Buffer << endl;


    cout << "Enter a sentence: " << endl;
    cin >> Buffer;



    gets(Buffer);
    cout << "Now the Buffer contains:--> " << Buffer << endl;

    return 0;
}

我知道更长时间有警告代码,但现在程序没有按照我的意愿执行。最后一部分没有输出我的新发送。

我知道有人提到不使用获取,但我尝试使用getline,显然我不能用它作为直接替换,所以我有点迷失。

任何建议

4 个答案:

答案 0 :(得分:1)

您无法读入包含字符串常量的内存。通常这些字符串常量存储在只读内存中,即使没有,它们也可以共享常量,因此您可以覆盖代码的所有部分的一个字符串。

您需要将字符串复制到某个缓冲区中,然后执行任何操作。例如:

const char *myOrigBuffer = "Dummy string";
char buffer[1024];
strcpy(buff, myOrigBuffer);
....
gets(buff);

答案 1 :(得分:0)

您无法修改字符串升级。你的编码方式太过“C风格”。 如果原始缓冲区内容无关紧要且您必须使用gets(),请不要初始化缓冲区:

char Buffer[100];
cout << "Enter a sentence: " << endl;

gets(Buffer);
cout << "Now the Buffer contains:--> " << endl;
cout << Buffer << endl;

不要忘记,如果你输入超过100个字符(作为缓冲区的大小),这也会崩溃。

由于不赞成使用,必须鼓励fgets:它可以保护您免受溢出。你应该用C风格编码:

char buffer[10];
printf("Your sentence : \n");
fgets(buffer, sizeof buffer, stdin);
printf("Your sentence : %s\n", buffer);

输出:

  

你的句子:
  1 34 6789012345
  你的判决:1 34 6789

尽管如此,您应该考虑将std::cinstd::string一起使用来制作正确的C ++输入:

std::string sentence;
std::cout << "Enter a sentence (with spaces): ";
std::getline(std::cin, sentence);
std::cout << "Your sentence (with spaces): " << sentence << std::endl;

输出:

  

输入一个句子(带空格):我的超级句子
  你的句子(带空格):我的超级句子

答案 2 :(得分:0)

"Dummy content."这样的字符串文字在逻辑上是const,因为任何试图更改其内容的操作都会导致未定义的行为。

定义/初始化

char *Buffer = "Dummy content.";
然而,

使Buffer成为一个非const指针(字符串文字的第一个字符)。这涉及转化(从const charchar *的数组)。由于历史原因,该转换存在于C中,因此仍然在C ++中。但是,随后使用Buffer修改字符串文字 - 这是gets(Buffer)所做的事情,除非用户没有输入任何数据 - 仍然会给出未定义的行为。

你的&#34;停止了工作&#34;错误是未定义行为的一种表现形式。

提供未定义的行为是弃用转换的原因。

注意:gets()已被弃用。它已从C标准中删除,从它起源的地方,完全是因为它非常危险(无法阻止它覆盖任意内存)。在C ++中,请改用getline()。无论如何,在同一输入或输出设备(或文件)上混合使用C I / O函数和C ++流函数通常不是一个好主意。

答案 3 :(得分:0)

  

char * Buffer =“Dummy content。”;

你应该在const char上使用指针,因为“Dummy content”。不是缓冲区,而是字符串文字上的指针,其类型为“n const char数组”和静态存储持续时间,因此无法通过指针进行更改。正确的变体是:

char const* Literal = "Dummy content.";

但您不能将其用作gets

的参数
  

得到(缓冲液);

这是个坏主意,应该在写入时导致写访问异常或内存损坏。您应该向gets传递指向存储接收字符串的内存块的指针。 此块应具有足够的长度来存储整个字符串,因此通常gets不安全,请查看https://stackoverflow.com/a/4309845/2139056以获取更多信息。 但作为临时测试解决方案,您可以在堆栈上使用缓冲区:

char Buffer[256];
gets(Buffer);

或动态分配的缓冲区:

char* Buffer= new char[256];
gets(Buffer);
//and do not forget to free memory after your output operations
delete [] Buffer;