Visual Studio 2013 strcpy_s 和一个字的大小

Visual Studio 2013 strcpy_s and size of a word

我是 C++ 的新手,最近开始使用字符串,但我遇到了 strcpy_s() 的问题。在 Visual Studio 中,如果我使用旧的 strcpy(),它说它不安全,在网上阅读更多内容后,我发现了原因,所以我开始不再使用 strcpy()。 在 strcpy() 中,我必须告诉它缓冲区的大小,但是我有问题,因为如果我使用 strlen() 它说缓冲区太小,即使我把 a=strlen(string)+1,所以我发现了另一个名为 size_t() 的错误,现在我不再有与缓冲区相关的错误问题,但我又遇到了另一个错误。

Error Link

代码:

#include <iostream>
#include <cstring>
#include <conio.h>
using namespace std;
int main()
{
    int  i, size_of_word;
    char word[202];
    cin.get(word, 201, '\n');
    cin.get();
    i = 0;
    while (i < strlen(word) - 1)
    {
        if (word[i] == word[i + 1])
        { 
            size_of_word = size_t(word + i ) + 1;
            strcpy_s(word + i + 2, size_of_word, word + i);
        }
        else 
        {
            i++;
        }
    }

    cout << word;
}

如评论所述,std::string 优于字符数组,它们更易于使用。

如果您不能使用它们:

strcpy_s第二个参数是目标缓冲区的大小,与字符串的大小不同。

word 缓冲区大小为 202,因此,word + i + 2 缓冲区大小为 202-i-2,而不是 size_of_word

size_of_word = size_t(word + i ) + 1;size_of_word 设置为 [address of word buffer] + i + 1 这没有任何意义...

这应该可行(我将缓冲区大小移至变量以使其更易于更改):

#include <iostream>
#include <cstring>
#include<conio.h>
using namespace std;
int main()
{
    int  i;
    static const size_t bufferSize = 202;
    char word[bufferSize];
    cin.get(word, bufferSize - 1, '\n');
    cin.get();
    i = 0;
    while (i < strlen(word) - 1)
    {
        if (word[i] == word[i + 1])
        { 
            strcpy_s(word + i + 2, bufferSize - i - 2, word + i);
        }
        else i++;
    }

    cout << word;
}