字符串不会与cout

时间:2016-03-17 19:52:12

标签: c++ string

我要做的是将两个字符串复制到第三个字符串,在第三个字符串中留下尽可能多的空格作为前两个字符串的字符总和,而不使用strcpy或类似的代码,下面的代码不会打印stc字符串。它运行但它不打印它。

#include <iostream>
#include <conio.h>
#include <string.h>

using namespace std;

int main()
{
  int i, j = 0, k = 0, str_1 = 0, str_2 = 0, str_3 = 0, space = 0;
  char sta[40];
  char stb[40];
  char stc[100] = { };

  cout << "Enter sentence: " << endl << endl;
  cin.getline(sta, 39);
  cout << "Enter Second Sentence: " << endl << endl;
  cin.getline(stb, 39);

  for (i = 0; i < 40; i++) {
    if (sta[i] == '\0') {
      break;
    } else {
      str_1++;
    }
  }
  cout << "The first sentence has: " << str_1 << " characters" << endl << endl;

  for (i = 0; i < 40; i++) {
    if (stb[i] == '\0') {
      break;
    } else {
      str_2++;
    }
  }
  cout << "The second sentence has: " << str_2 << " characters" << endl << endl;

  space = str_1 + str_2;
  for (i = 0; sta[i] != '\0'; i++) {
    stc[space] = sta[i];
    space++;
    str_3++;
  }
  for (j = 0; stb[j] != '\0'; j++) {
    stc[space] = stb[j];
    space++;
    str_3++;
  }
  stc[space] = '\0';
  cout << "The third sentence is: " << stc << endl << endl;
  cout << "And has " << str_3 << " characters " << endl;
  return 0;
}

2 个答案:

答案 0 :(得分:1)

您的问题是您尝试初始化stc,但是:

char stc[100] = { };

没有做你认为它正在做的事情。实际上,它应该使用所有零值初始化数组,这与NUL终结符'\0'字符相同,这会导致稍后打印数组以停止在第一个字符上。不幸的是,我不认为标准允许你默认使用0以外的任何值来初始化元素,所以说char stc[100] = {' '}已经出来了。

您可以在stastb中测试字符时添加空格:

char stc[100];
// ...
for (i = 0; i < 40; i++) {
    if (sta[i] == '\0')
      break;
    else {
      str_1++;
      stc[space++] = ' ';
    }
  }
// and the same for stb. Now you don't need to assign space = str_1 + str_2

Live Demo

当然,如果您使用来自std :: algorithm的std::string和算法,这可能会更容易,但看起来您想要以艰难的方式做事。也许首先编写一个辅助函数来计算字符?

答案 1 :(得分:0)

你的问题是在stc数组中,开头有'\ 0'字符,所以当它开始读它时,它已经认为它是字符串的结尾。 而不是做:

space = str_1 + str_2;

只是做

space = 0;

并且不要忘记像这样初始化字符串

char stc[100] = "";

如果你不存在,那里就会有奇怪的角色,你不会知道字符串结尾

这样,数组将从头开始填充,而不是从随机位置填充。