我目前正在编写一个使用字符串函数的程序。我需要一些关于如何在main()中使用myStrcat()显示“ Hello World”及其长度的建议/提示。我是编程新手,将不胜感激任何支持。
我的代码:
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int myStrlen(char str1[])
{
int i = 0;
for (i=0; str1[i] != '\0'; i++)
str1[i] = '\0';
return i;
}
int myStrcat(char str2[], char str3[])
{
}
int myStrcpy(char str4[], char str5[])
{
int i = 0;
for (i=0; str5[i] != '\0'; i++)
str4[i] = str5[i];
str4[i] = '\0';
return i;
}
int main()
{
const int SIZE = 11;
char s1[SIZE] = "Hello";
char s2[SIZE] = "World";
cout << "s1: " << " " << s1 << endl << endl; ///Should display "Hello"
cout << "The length of s1: " << myStrlen(s1) << endl << endl;
cout << "Doing strcat(s1, s2) " << endl;
myStrcat(s1, s2);
cout << "s1: " << " " << s1 << endl; /// Should display "Hello World"
cout << "The length of s1: " << myStrlen(s1) << endl << endl;
cout << "Doing strcpy(s1, s2) " << endl;
myStrcpy(s1, s2);
cout << "s1: " << " " << s1 << endl; /// Should display "World"
cout << "The length of s1: " << myStrlen(s1) << endl << endl;
我的输出:
s1: Hello
The length of s1: 5
Doing strcat(s1, s2)
s1:
The length of s1: 0
Doing strcpy(s1, s2)
s1: World
The length of s1: 5
第6行和第7行假定显示Hello World及其长度(即11)。
答案 0 :(得分:0)
对于每个功能,您不仅有很多正确的开始。首先,让我们考虑一下两者的收益。 myStrlen
应该返回size_t
而不是int
。 C ++指定用于计数器,测量等的size_type。其余函数应返回char*
(失败时应返回nullptr
)。
查看您拥有的myStrlen
函数
for (i=0; str1[i] != '\0'; i++)
str1[i] = '\0';
您正在将str1
中的每个字符设置为 nul-character ,因为您要将循环应用于下一个表达式。您不必担心myStrlen
中的任何内容都必须以n结尾,而您只是在计算字符。因此,您可以将其重写如下:
size_t myStrlen (const char *str)
{
size_t l = 0;
for (; str[l]; l++) {}
return l;
}
您的myStrcpy
看起来是可行的,尽管在使用它们之前应始终验证输入参数是否不是nullptr
-我留给您。由于您具有myStrlen
函数,因此可以简单地将其与memcpy
一起使用来创建myStrcpy
函数,如下所示:
char *myStrcpy (char *dest, const char *src)
{
size_t len = myStrlen(src);
return (char *)memcpy (dest, src, len + 1);
}
(注意:传统上,在复制或连接时,您具有源(src
)和目标(dest
)参数)
对于您的myStrcat
函数,您只是使用myStrlen
函数在dest
中找到要附加src
的偏移量,因此您实际上只需要调用{ {1}},然后调用myStrlen
将myStrcpy
复制到src
中的偏移量,例如
dest
在您的char *myStrcat (char *dest, const char *src)
{
size_t len = myStrlen (dest);
return myStrcpy (dest + len, src);
}
中,如果要在main()
和"Hello"
之间留一个空格,那么"World"
太低了,无法容纳串联字符串const int SIZE = 11;
则需要"Hello World"
(包括 nul-termination 字符)。 请勿跳过缓冲区大小。 12-bytes
很小。
保留您的128
,但更新main()
并在SIZE = 12;
和"Hello"
之间添加一个空格,并附加调用"World"
,您可以执行以下操作:
myStrcat
(注意:不包括int main (void)
{
const int SIZE = 12; /* too short by 1 if you add space between */
char s1[SIZE] = "Hello";
char s2[SIZE] = "World";
std::cout << "s1: " << " " << s1 << std::endl << std::endl;
std::cout << "The length of s1: " << myStrlen(s1) << std::endl << std::endl;
std::cout << "Doing strcat(s1, s2) " << std::endl;
myStrcat(s1, " ");
myStrcat(s1, s2);
std::cout << "s1: " << " " << s1 << std::endl;
std::cout << "The length of s1: " << myStrlen(s1) << std::endl << std::endl;
std::cout << "Doing strcpy(s1, s2) " << std::endl;
myStrcpy(s1, s2);
std::cout << "s1: " << " " << s1 << std::endl;
std::cout << "The length of s1: " << myStrlen(s1) << std::endl << std::endl;
}
,这在当今时代是一种不好的形式)
使用/输出示例
using namespace std;
仔细检查一下,如果还有其他问题,请告诉我。
答案 1 :(得分:0)
首先,您应该阅读Why is “using namespace std;” considered bad practice?
如果要开始编程,请不要使用c样式字符串。使用std::string。使用起来更加简单。
#include <iostream>
#include <string>
int myStrlen(const std::string &str) {
return str.length();
}
int myStrcat(std::string &str1, const std::string &str2) {
str1 += str2;
str1.length();
}
int myStrcpy(std::string &str1, const std::string &str2) {
str1 = str2;
return str1.length();
}
int main() {
std::string s1 = "Hello";
std::string s2 = "World";
std::cout << "s1: " << s1 << "\n\n"; ///Should display "Hello"
std::cout << "The length of s1: " << myStrlen(s1) << "\n\n";
std::cout << "Doing strcat(s1, s2) " << '\n';
myStrcat(s1, s2);
std::cout << "s1: " << s1 << '\n'; /// Should display "Hello World"
std::cout << "The length of s1: " << myStrlen(s1) << "\n\n";
std::cout << "Doing strcpy(s1, s2) " << '\n';
myStrcpy(s1, s2);
std::cout << "s1: " << s1 << '\n'; /// Should display "World"
std::cout << "The length of s1: " << myStrlen(s1) << "\n\n";
return 0;
}