Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 连接两个字符串c++;_C++_String_Concatenation - Fatal编程技术网

C++ 连接两个字符串c++;

C++ 连接两个字符串c++;,c++,string,concatenation,C++,String,Concatenation,我试图在不使用+运算符的情况下将两个字符串粘在一起,也使用循环来实现这一点。问题是,当它读取两个字符串时,它无法打印第二个字符串,而只显示第一个字符串。 这是我的密码 此代码类似于在一个字符串中复制两个字符串 char str1[MAX]; char str2[MAX]; cout<<"Enter The first String:\n"; cin.getline(str1,MAX,'\n'); cout<<"Enter the second String:\n"; c

我试图在不使用+运算符的情况下将两个字符串粘在一起,也使用循环来实现这一点。问题是,当它读取两个字符串时,它无法打印第二个字符串,而只显示第一个字符串。 这是我的密码 此代码类似于在一个字符串中复制两个字符串

char str1[MAX];
char str2[MAX];

cout<<"Enter The first String:\n";
cin.getline(str1,MAX,'\n');
cout<<"Enter the second String:\n";
cin.getline(str2,MAX,'\n');

char str3[2*MAX];   int k=0;

for(int i=0;i<MAX;i++)
{ str3[k]=str1[i];  k++;    }
for(int j=0;j<MAX;j++)
{ str3[k]=str2[j];  k++;    }

str3[k]='\0';
cout<<endl<<"Here is the concatenated string:\n";
cout<<str3<<endl;
char str1[MAX];
字符str2[MAX];

cout您的代码超过了
str1
str2
的末尾,包括它们的空终止符。一旦复制了
srt1
的空终止符,则认为
str3
中的C字符串已完成,因此忽略
str2
部分

您需要修改第一个循环,使其在
str1
中看到
'\0'
后停止,并从此点复制
str2
。对第二个循环执行相同的操作。您的代码已添加空终止,因此结果将是正确的:

for(int i=0;i<MAX && str1[i] != '\0';i++)
{ str3[k]=str1[i];  k++;    }
for(int j=0;j<MAX && str2[j] != '\0';j++)
{ str3[k]=str2[j];  k++;    }

for(int i=0;i正确的代码应为:-

char str3[2*MAX];   
int k=0;

for(int i = 0; str[i] != '\0'; i++)
{
  str3[k]=str1[i];  
  k++;    
}
for(int j=0 ; str2[j] != '\0'; j++ )
{ 
   str3[k] = str2[j];  
   k++;   
}
str3[k]='\0';
您没有考虑空终止符,因此读取了空终止符。

更改此项:

for(int i=0; str1[i] ;i++) 
{ str3[k]=str1[i];  k++;    }
for(int j=0; str2[j] ;j++)
{ str3[k]=str2[j];  k++;    }
str1
str2
结束时,即
str1[i]
str2[j]

将是
0('\0')
。但您在
MAX
中循环。这就是程序产生错误输出的原因。

希望您现在理解:)

最好使用指针编写这样的代码

所以我会替换这个错误的代码

char str3[2*MAX];   int k=0;

for(int i=0;i<MAX;i++)
{ str3[k]=str1[i];  k++;    }
for(int j=0;j<MAX;j++)
{ str3[k]=str2[j];  k++;    }

str3[k]='\0';
同样,也可以使用for循环编写。比如说

char str3[2 * MAX];

char *p = str3;

for ( char *q = str1; *p = *q++; ++p );
for ( char *q = str2; *p++ = *q++; );

@dasblinkenlight解释了为什么她/他的答案中没有这一点

下面是另一个使用中定义的标准C(++)库函数
strcat
的解决方案。看

#包括
#包括
使用名称空间std;
int main(int argc,字符**argv){
字符str1[MAX];
字符str2[MAX];

cout Dang,too fast;)添加一个描述str1、str2.AFAIK的空终止原因的引用,文档指定
char*
的最后一个元素总是
null终止的
so
for(int i=0;i
应该足够了,而且更加优化。@Centril也可以,但它可能会复制比您必须复制的更多的字符。例如,如果用户输入5个字符,而您复制了所有50个字符,则这是45个无用的字符副本。这并不是说它会在时间上产生任何差异,但它不会使代码看起来更简单哦,是的,真的,忘了那个。我还没有通过这部分,但是哥们!“阿里,今天你知道了一些新东西。”:你在使用C字符串。你考虑过用C++字符串吗?class@Will它现在做了……它没有用C++的方式。
char str3[2 * MAX];

char *p = str3;

for ( char *q = str1; *p = *q++; ++p );
for ( char *q = str2; *p++ = *q++; );
#include <iostream>
#include <cstring>
using namespace std;

int main(int argc, char** argv) {
    char str1[MAX];
    char str2[MAX];

    cout << "Enter The first String:" << endl;
    cin.getline(str1, MAX);
    cout << "Enter the second String:" << endl;
    cin.getline(str2, MAX);

    char str3[2 * MAX];
    strcat(str3, str1);
    strcat(str3, str2);

    cout    << endl << "Here is the concatenated string:" << endl
            << str3 << endl;
}