如何解决C++ 程序不返回值函数
我想编写一个程序,创建一个将两个字符串连接起来形成一个字符串的函数。但是,我的程序没有返回任何值。
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
char* my_str_cat( char* s1,char* s2,char* combined ){
for(int i = 0;i<strlen(s1);i++){
combined[i]=s1[i];
}
for (int j=0;j<strlen(s2);j++){
combined[strlen(s1)+j]=s2[j];
}
return combined;
}
int main(){
char s1[100];
char s2[100];
char** combined = new char*;
cout<<"Enter s1: "<<endl;
cin.getline(s1,100);
cout<<s1<<endl;
cout<<"Enter s2: "<<endl;
cin.getline(s2,100);
my_str_cat(s1,s2,*combined);
delete combined;
return 0;
}
解决方法
本声明
char** combined = new char*;
声明一个 char **
类型的指针,该指针指向为 char *
类型的对象分配的内存。
在此调用中取消引用此指针
my_str_cat(s1,s2,*combined);
将类型为 char *
的未初始化指针传递给函数 my_str_cat
。
在函数中,这个未初始化的指针用于访问导致未定义行为的内存。
您需要为一个足够大的字符数组分配内存,以存储两个串联的 C 字符串形成一个新的 C 字符串。
您可以在函数内部分配内存。
该函数可以如下所示,如下面的演示程序所示。
#include <iostream>
#include <iomanip>
#include <cstring>
char * my_str_cat( const char *s1,const char *s2 )
{
size_t n1 = std::strlen( s1 );
char * result = new char[n1 + std::strlen( s2 ) + 1];
std::strcpy( std::strcpy( result,s1 ) + n1,s2 );
return result;
}
int main()
{
const size_t N = 100;
char s1[N];
char s2[N];
std::cout << "Enter s1: ";
std::cin.getline( s1,sizeof( s1 ) );
std::cout << "Enter s2: ";
std::cout << std::noskipws;
std::cin.getline( s2,sizeof( s2 ) );
char *combined = my_str_cat( s1,s2 );
std::cout << combined << '\n';
delete []combined;
return 0;
}
程序输出可能看起来像
Enter s1: Hello
Enter s2: World!
Hello World!
另一种声明和定义函数的方法是,当函数的用户负责向将包含两个连接字符串的函数提供结果字符数组时。
例如
#include <iostream>
#include <iomanip>
#include <cstring>
char * my_str_cat( char *result,const char *s1,const char *s2 )
{
return std::strcat( std::strcpy( result,s1 ),s2 );
}
int main()
{
const size_t N = 100;
char s1[N];
char s2[N];
std::cout << "Enter s1: ";
std::cin.getline( s1,sizeof( s2 ) );
char *combined = new char[std::strlen( s1 ) + std::strlen( s2 ) + 1];
std::cout << my_str_cat( combined,s1,s2 ) << '\n';
delete []combined;
return 0;
}
程序输出可能与之前的演示程序的显示方式相同
Enter s1: Hello
Enter s2: World!
Hello World!
不使用标准字符串函数,只使用循环,可以通过以下方式定义函数。
char * my_str_cat( char *result,const char *s2 )
{
char *p = result;
while ( *s1 ) *p++ = *s1++;
while ( ( *p++ = *s2++ ) );
return result;
}
,
首先,它(将)返回一个值,只是没有分配给任何东西。这样做:
*combined = my_str_cat(s1,*combined);
也可以通过引用组合通过,或者不全部通过。
但这不会导致它因段错误而崩溃,因为您在 s1 未初始化时引用了 s1[i]。 我会以 C 风格纠正这一点,因为你的代码实际上只是带有香料的 C:
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <string>
using namespace std;
void my_str_cat( char* s1,char* s2,char* &combined){
int len = strlen(s1);
combined = (char*)calloc(1,(len + strlen(s2)));
strcpy(combined,s1);
strcpy(combined + len,s2);
}
int main(){
char s1[100];
char s2[100];
char* combined;
cout<<"Enter s1: " << endl;
cin.getline(s1,100);
cout<<s1<<endl;
cout<<"Enter s2: " << endl;
cin.getline(s2,100);
my_str_cat(s1,combined);
cout << combined << endl;
delete combined;
return 0;
}
(虽然这行得通,但我在写这篇文章时感觉错过了一些东西。如果你知道,请告诉我是什么。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。