字符串函数:Strcat()

时间:2019-09-09 06:07:49

标签: c++

我目前正在编写一个使用字符串函数的程序。我需要一些关于如何在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)。

2 个答案:

答案 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}},然后调用myStrlenmyStrcpy复制到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;
}