在C ++中使用char *作为字符串

时间:2015-04-10 12:43:15

标签: c++ string pointers

#include<iostream>
using namespace std;
int main()
{
   char *a;
   cin>>a;
   cout<<a;/*when input is string it gives segmentation fault*/
   char* b="hello";/*while this thing works fine*/
   cout<<b;
}

两者之间有什么区别?

6 个答案:

答案 0 :(得分:4)

除非明确初始化,否则局部变量不会以任何方式初始化,它们的值是 indeterminate (实际上看似随机)。这意味着您的指针a很可能不会指向有效位置,因此当您使用它来获取输入时,程序将写入它不拥有的某个内存,从而导致undefined behavior(只是崩溃的最常见原因。)

当您定义变量b时,您告诉编译器应该指向特定位置,指向由编译器创建并由程序拥有的字符数组。你初始化变量,所以使用它将工作fin。但请注意,字符串文字是被认为是只读的字符数组,所以要正确,你应该这样做。

const char* b = "hello";

答案 1 :(得分:2)

在第二个例子中,编译器分配的内存是字符串文字的特殊位置,在第一个例子中没有这样的空格......

由于cin并未限制您输入的输入量,因此您不应使用它来填充裸char *缓冲区,除非您确实将输入限制为较少比缓冲区

但你理论上可以做一些事情(我认为......如果流覆盖就像那样工作):

char *a = (char *)malloc(500);
cin >> setw(500) >> a;

答案 2 :(得分:1)

您需要在

中分配空间来存储字符
cin >> a;

您将它们存储到无效位置,因为a char指针尚未指向有效内存,因此您需要指向一个有效的块

  1. 您可以通过new运营商请求

    a = new char[length];
    cin >> a;
    

    但你需要小心做

    delete[] a;
    

    使用完毕后,请注意不要写入超过length - 1个字节。

  2. 将其声明为类似

    的数组
    char a[100];
    cin >> a;
    

    将有效。

  3. 但你应该在c ++中避免这种情况,而是使用std::string

答案 3 :(得分:1)

char *a;// it is pointer which is memory was unallocated. 

因此,使用此功能无法获得该值。你必须动态分配内存。

char *b="hello";

"hello"将存储在只读存储器中。因此,cout只需打印该内容。

答案 4 :(得分:0)

您已经声明了一个指针,但是您没有留出任何内存来存储字符串本身。在您的代码中,a尚未初始化为指向任何有意义的位置。您需要将其设置为指向现有缓冲区:

char buf[SOME_SIZE];
char *a = buf;

或者您需要在运行时分配该内存:

char *a = new char[SOME_SIZE];

原因

char *b = "hello";

的作用是留出空间来存储字符串文字"hello",并将该字符串的地址分配给b。请注意,尝试更新字符串文字的内容将调用未定义的行为(至少在C中,我有理由相信它在C ++中是正确的),因此您不希望编写类似

的内容
cin >> b;

只要b指向文字。

答案 5 :(得分:0)

两种结构都是错误的。这首先是它指定的效果是错误的,但如果这是代码的唯一问题,编译器必须强制你并创建具有该ungood效果的可执行文件。第二个结构是错误的,因为它破坏了C ++语言的规则,因此符合标准的编译器不会接受它。


第一个构造:

char *a;
cin>>a;

使用未初始化的指针变量a。这会导致未定义的行为,程序可能会崩溃,或者向Swizz总裁发送愤怒的电子邮件,或者做你认为会做的事情,无论如何。编译器有义务生成可执行文件,但可能会发出警告诊断信息。


第二个结构:

char* b="hello";
标准C ++中

无效。标准C ++不提供从字符串文字到char*的转换。但是,有些编译器仍然会接受它,然后将b初始化为指向字符串"hello"中第一个字符的指针。


而不是处理原始指针等,你应该使用std::string,如下所示:

#include <iostream>
#include <string>
using namespace std;

auto main() -> int
{
    string a;
    getline( cin, a );
    cout << a << "\n";
    string const b="hello";
    cout << b << "\n";
}