C++字符串中的分段错误(核心转储)


#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看起来很正常(除了内部couts和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_castC++,并注意对于 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++最好使用newdelete进行内存分配和释放,因此在您用我的示例弄清楚之后,请尝试摆脱 C 函数:mallocreallocfree

之后,就像使您的程序更加C++解决方案一样,请考虑将字符串类型从char *更改为std::string这肯定会使您免于内存分配问题并使程序的所有其他部分更简单(例如s1 += s2操作是可能的(。当你到达那个阅读关于字符串的获取线

相关内容

  • 没有找到相关文章

最新更新