gpt4 book ai didi

c++ - 我们应该在带有 char *func(char *string) 的函数中返回什么?需要简要说明这与 c 中的 char[] 有何不同?

转载 作者:行者123 更新时间:2023-11-30 01:34:47 24 4
gpt4 key购买 nike

我需要知道 char * 函数是如何工作的,以及我们如何在函数中操作 char * 数组并返回它。借助以下代码进行解释以及为什么它不打印任何内容?而且我不能使用 std::string。这是一个基于函数的问题,我不能在其中使用 std::string。并且必须从函数返回 ans

#include<stdio.h>
using namespace std;
char * change(char *str)
{
char *s="S";
for(int i=1;str[i]!='\0';i++)
{
s[i]=str[i]+32;
}
return s;
}
int main()
{
char *str="SampleRun";
cout<<change(str);
}

最佳答案

您展示的代码不会按原样运行,因为它有很多错误和未定义的行为

  • 使用 std::cout没有#include <iostream>

  • 使用 <stdio.h>而不是 <cstdio>

  • change() , 指向 s到只读内存(在 C++11 及更高版本中是非法的!),使用无效的循环计数器循环,并尝试从 str 复制更多字符至 s比分配给 s .

  • main() , 指向 str到只读存储器。

你需要使用更像这样的东西:

#include <iostream>
#include <cstring>
using namespace std;

char* change(char *str)
{
int len = strlen(str);
char *s = new char[len + 1];
for(int i = 0; i < len; ++i)
{
s[i] = str[i] + 32;
}
s[len] = '\0';
return s;
}

int main()
{
char *str = change("SampleRun");
cout << str;
delete[] str;
return 0;
}

或者这个:

#include <iostream>
#include <cstring>
using namespace std;

char* change(char *str, int len)
{
for(int i = 0; i < len; ++i)
{
str[i] += 32;
}
return str;
}

int main()
{
char str[] = "SampleRun";
cout << change(str, strlen(str));
return 0;
}

但是,既然您使用的是 C++,那么您确实应该使用 std::string相反:

#include <iostream>
#include <string>
using namespace std;

string change(const string &str)
{
string s;
s.reserve(str.length());
for(char ch : str)
{
s.push_back(ch + 32);
}
return s;
}

int main()
{
cout << change("SampleRun");
return 0;
}

或者这个:

#include <iostream>
#include <string>
using namespace std;

void change(string &str)
{
for(char &ch : str)
{
ch += 32;
}
}

int main()
{
string str = "SampleRun";
change(str);
cout << str;
return 0;
}

话虽这么说,如果您的目标是将字符串小写(唯一合理的原因是向字符添加 32,除非您试图通过基本轮换密码实现模糊性),那么不要盲目每个 字符添加 32,考虑使用 std::tolower() 反而。您可以将其与 std::transform() 一起使用, 例如。这是 C++ 中小写字符串的常见(尽管不是完全准确的)方式,例如:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

char* change(char *str)
{
int len = strlen(str);
char *s = new char[len + 1];
transform(str, str+len, s, [](unsigned char ch){ return tolower(ch); });
s[len] = '\0';
return s;
}

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

char* change(char *str, int len)
{
transform(str, str+len, str, [](unsigned char ch){ return tolower(ch); });
}

#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;

string change(const string &str)
{
string s;
s.reserve(str.length());
transform(str.begin(), str.end(), back_inserter(s), [](unsigned char ch){ return tolower(ch); });
return s;
}

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

void change(string &str)
{
transform(str.begin(), str.end(), str.begin(), [](unsigned char ch){ return tolower(ch); });
}

关于c++ - 我们应该在带有 char *func(char *string) 的函数中返回什么?需要简要说明这与 c 中的 char[] 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55659779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com