使用cout打印字符数组的全部内容

15

我对C++很陌生(只有一点Java编程基础),我不知道如何打印出一个字符数组的所有内容。我认为需要使用循环,并以数组长度为基础来构建循环,但是我的尝试无法成功编译。以下是我目前的代码。谢谢您提前的帮助!

#include <iostream>
#include <string>

using namespace std;

void namePrinting(char name[])
{
   int i = 0;
   cout << "Name: ";
   while(i <= name.length() )
   {
   cout << name[i];
   i++;
   }

}

int main()
{
   string fullName;
   cout << "Enter name: ";
   cin >> fullName;
   char nameArray[fullName.length()];
   namePrinting(nameArray);
}

1
只需打印 std::string - chris
这个任务要求我使用字符数组,不幸的是。 - Chandy
什么赋值?只需使用 cout<<fullName; - P0W
1
一个用作字符串的字符数组通常会以NUL结尾。ostream重载了“operator<<”,可以打印完整的以NUL结尾的字符串。 - Jerry Coffin
您知道如何打印一个 int 数组吗?从一个 char 数组开始可能不是最好的选择,因为它有一些特殊性。 - Beta
显示剩余6条评论
6个回答

30

从简单的事情开始:

char c_array[3];
c_array[0] = 'a';
c_array[1] = 'b';
c_array[2] = 'c';

for(int i=0 ; i<3 ; ++i)
{
  cout << c_array[i];
}
cout << endl;

在完全理解了这一点之前,请不要再继续前进。 现在请注意,如果你给数组添加一个空字符作为结尾,你可以将整个数组传递给coutoperator<<将会知道何时停止:

char c_array[4];
c_array[0] = 'a';
c_array[1] = 'b';
c_array[2] = 'c';
c_array[3] = 0;

cout << c_array << endl;

使用其他类型的数组无法这样做。 现在请注意,您可以以这种方式分配一个char[],并且它将是以空字符结尾的:

char c_array[20] = "abc";
cout << c_array << endl;

您甚至可以省略数组的大小,编译器会自动推断:

char c_array[] = "abc";    // this is a char[4];
cout << c_array << endl;

有几种不同的方法可以将用户输入读入数组中,但看起来你已经知道了,而且这个答案也变得很长了。


4
使用operator<<(char)逐个编写每个字符效率低下。
将其转换为std::string,并使用(const char*,size_t)构造函数进行转换,然后使用operator<<(const std::string&)也是低效的。
正确的方法是简单地使用http://en.cppreference.com/w/cpp/io/basic_ostream/write 附注:请注意,您的代码不是有效的C++。char name[]基本上和char* name同义,并且不知道它的长度(也没有.length())。而且,您的nameArray未初始化。大小,是;初始化,不是。您需要缺少一个std::copystrncpy调用来将fullName的内容复制到nameArray中。

3
printf("%s", nameArray);

只要就可以使用!


0
这里有一个通用的方法来实现它。

运行示例

// write out any c style char array to an output stream
#include <iostream>

#include <string.h>

void write_char_array(std::ostream& os, const char* string) {
    // faster than an ostream_iterator and std::copy
    os.write(string, strlen(string));
}

int main()
{
    const char question[] = "What is your name? ";
    const char* answer    = "Bob";

    write_char_array(std::cout, question);
    write_char_array(std::cout, answer);
}

输出:

What is your name? Bob

0
对于我的问题,我的程序正在寻找一个命令行参数。由于我没有提供该参数,因此它会抛出“terminate called after throwing an instance of std::logic_error what(): basic_string::_S_construct null not valid”的异常。
希望这能给你一些启示,帮助你解决自己的问题。

0

这与OP有点不太相关,但我谷歌了“c++打印std :: array char”,这是最热门的搜索结果,但这些答案都没有涵盖如何使用std :: array<char,>。 您无法直接将operator<<应用于数组,您需要先访问其 .data()指针:

#include <string>
#include <iostream>
#include <array>
 
int main()
{
  // a direct initialization example. Remember, need string legnth+1 for
  // a NUL terminator
  std::array<char, 6> bar{"hello"};
  // print to std::out using operator<< and the .data() ptr access
  std::cout << bar.data() << std::endl;

  // extra example copying the contents of a string to an array.
  std::string foo("how are you?");
  // {} initializes it to 0, giving us guaranteed NUL termination
  std::array<char, 24> tar{};
  // copy string to array, std::min ensures we won't overrun
  foo.copy(tar.data(), std::min(foo.length(), tar.size()-1));
  std::cout << tar.data() << std::endl;

  return 0;
}

输出:

hello
how are you?

演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接