在阅读了几个答案后,我已将代码更正为:
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,显然我不能用它作为直接替换,所以我有点迷失。
任何建议
答案 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::cin
与std::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 char
到char *
的数组)。由于历史原因,该转换存在于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;