#include<iostream>
#include<string>
using namespace std;
int STRLEN(char* s){
cout<<"n1.";
int i=0;
while(s[i] != ' '){
cout<<"n2.";
i++;
}
return i;
}
int main(){
int i,j;
char* s1;
char* s2;
cout<<"nEnter string : ";
cin.getline(s1,50);
cout<<s1;
cout<<"nEnter string : ";
cin.getline(s2,50);
cout<<s2;
int L1=STRLEN(s1);
int L2=STRLEN(s2);
cout<<"nL1 = "<<L1;
cout<<"nL2 = "<<L2;
/*
for*(i=L1,j=0; i<L1+L2; i++,j++)
{
s1[i] = s2[j];
j++;
}
cout<<s1;*/
return 0;
}
上面的代码在第int L1=STRLEN(s1);
行给我带来了分段错误 请提供一个解决方案,我希望动态操作我的字符串,以便我可以扩展给定的字符串,也可以在不使用内置方法的情况下将新字符串附加到现有字符串。 同样不使用string
数据类型
实际上,你的函数STRLEN
看起来很正常(除了内部cout
s和s缺乏const
(
int STRLEN(const char* s)
{
int i=0;
while(s[i] != ' ')
{
i++;
}
return i;
}
内存分配中的问题:getline
不会为您分配内存 - 您必须为字符串分配内存
char* s1;
char* s2;
例如:
char* s1 = malloc(100);
char* s2 = malloc(100);
实际上,对于您的情况,cin.getline(s2,50);
50 字节就足够了:
char* s2 = (char*)malloc(50);
这里(char*)
是指针类型的显式强制转换(另请参阅static_cast
C++,并注意对于 C 隐式强制转换在这种情况下有效(
更新:
只是为了给你更多的例子,引发更多的问题......以下是我对程序的修改,每个部分都有注释:
#include<iostream>
#include<string>
using namespace std;
int STRLEN(const char* s)
{
int i=0;
while(s[i] != ' ')
{
i++;
}
return i;
}
int main(void)
{
int i; // one counter will be enough
char* s1;
char* s2;
// allocation the memory
s1 = static_cast<char*>(malloc(50));
s2 = static_cast<char*>(malloc(50));
// check results of memory allocation
if(!s1 || !s2)
{
cerr << "Something went wrong!" << endl;
return 1;
}
// getting strings
cout<<"nEnter the first string : ";
cin.getline(s1,50);
cout<< "S1 : [" << s1 << "]" << endl;
// clean input buffer before next string input
cin.clear(); // reset state of cin
cin.ignore(INT_MAX, 'n'); // clean the input buffer
// continue input
cout<<"nEnter the second string : ";
cin.getline(s2,50);
cout<< "S2 : [" << s2 << "]" << endl;
// count sizes (like strlen)
int L1=STRLEN(s1);
int L2=STRLEN(s2);
// reallocate memory for resulting string in s1
if( !(s1 = static_cast<char*>(realloc(s1, L1+L2+1))) )
{
cerr << "Something went wrong while reallocating memory!" << endl;
return 1;
}
// manipulations with strings (like strcat)
for(i=0; i <= L2; i++) // <= to copy ' ' also
{
s1[i + L1] = s2[i];
}
cout<< "Result : [" << s1 << "]" << endl;
// deallocate memory
free(s1);
free(s2);
return 0;
}
正如molbdnilo在评论中正确指出的那样,C++最好使用new
和delete
进行内存分配和释放,因此在您用我的示例弄清楚之后,请尝试摆脱 C 函数:malloc
、realloc
和free
。
之后,就像使您的程序更加C++解决方案一样,请考虑将字符串类型从char *
更改为std::string
这肯定会使您免于内存分配问题并使程序的所有其他部分更简单(例如s1 += s2
操作是可能的(。当你到达那个阅读关于字符串的获取线