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