【问题标题】:difference between char c[100] and char *c both with cin.getline()char c[100] 和 char *c 与 cin.getline() 的区别
【发布时间】:2012-09-08 07:39:36
【问题描述】:

我对 cin.getline(char *s, int num_char, char delim); 有一些疑问

有什么区别:

char c[100];  
cin.getline(c,100,'\n');  

char *c = new char[100]; //this is the correct form I want to show you 
cin.getline(c,100,'\n');  

我只知道一件事,第二件事不行:-)

【问题讨论】:

  • 第二个在什么情况下不起作用?最初你有一个语法错误,虽然现在已经修复了。
  • @john:CodingMash 似乎已经在编辑中回答了这个问题。
  • @Coding Mash:你为什么要编辑代码?不要那样做,除非 OP 承认这是翻译错误。

标签: c++ new-operator getline c-strings


【解决方案1】:

您的第二个代码 sn-p 是语法错误。这样就可以了

char *c = new char[100];  
cin.getline(c,100,'\n');

两者的区别在于,在第二种情况下,内存是动态分配的。这有两个效果,首先,数组不会自动销毁,在第一个示例中,当您退出声明它的函数时,数组将自动销毁。第二个效果是,除非您使用 delete[] 销毁数组,否则您有内存泄漏。足够多的内存泄漏,你的程序就会崩溃。

根据您希望何时销毁数组、在函数结束时自动销毁或使用delete[] 来选择您想要的版本。当然你真的应该使用std::string

【讨论】:

  • 那么您的代码中的其他地方有错误。在 C++ 中,程序的一个部分中的错误导致程序的另一部分崩溃是很常见的。如果您需要这方面的帮助,您将不得不发布整个程序。到目前为止已经发布的代码没有任何问题(任何一个版本)。
  • 现在可以使用了。谢谢。但这是该代码第一次使用 char *c = new char[1000] 和 cin.getline(c,1000,'\n')。好的,现在所有代码都可以正常工作了。只是一个问题:在 Qt 和 wxWidget 之间,哪个 GUI 更容易学习和更复杂,因为它提供了强大的类和更易于使用
  • 这是 C++ 的大问题。仅仅因为您的代码有效,并不意味着它不包含错误。如果 char *c = new char[1000]; cin.getline(c,1000,'\n'); 之前没有为您工作,那么您的代码中的其他地方有错误。你有信心找到它吗?正如我所说,仅仅因为它现在可以工作并不意味着您已经修复了之前的错误。
  • 不不,它现在真的有效,我刚刚对一些 char 指针有了一些条件,现在一切都在正确的方式。现在,如果我想要一个 GUI API,在 Qt 和 wxWidget 之间哪个 API 最有趣??
【解决方案2】:

C++ 不允许您通过cingetline 直接在字符指针中进行输入。如果要在动态分配的 cstring 中获取输入,请先在静态 char 数组中获取输入,然后使用 strcpy() 将数据复制到 char 指针中。

在这里查看我的答案 getline(cin,_string);

【讨论】:

  • 有两个getline函数。一个是 istream 类的成员,它确实采用 char 指针。
  • 来自std::basic_istream 的文档:" basic_istream<charT,traits>& getline(char_type* s, streamsize n, char_type delim); 效果:表现为一个未格式化的输入函数(如 27.7.2.3,第 1 段所述)。构造一个哨兵对象后,提取字符并存储将它们放入数组的连续位置,数组的第一个元素由s 指定。"
【解决方案3】:

如果你使用

getchar()

gets()

返回值将是一个 char*。 有时由于缓冲区不干净而出现问题。
所以清理它:

cin.ignore()

【讨论】:

    【解决方案4】:

    当你调用 c 时,它是通过引用传递的,而在第二种情况下,c 是作为指针传递的。

    第二种情况同:

    char c[100];
    Char *p = &c;
    cin.getline(p,100,'\n');
    

    【讨论】:

    • 在这两种情况下都没有引用。您的代码示例无法编译。
    • 没有。 c 将衰减为指向其第一个元素的指针,当被传递给一个函数时,该函数需要一个正是需要的指针。
    • Charles,原来没有编译,所以功能相同的代码编译不出来也就不足为奇了。
    猜你喜欢
    • 2013-05-16
    • 2014-03-21
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多