Badruddin Koronfol Ответов: 3

Как решить эту проблему с помощью strncpy_s


Когда я использую "strncpy", у меня была ошибка:
"Ошибка C4996 'strncpy': Эта функция или переменная может быть небезопасной. Подумайте о том, чтобы вместо этого использовать strncpy_s. Чтобы отключить устаревание, используйте _CRT_SECURE_NO_WARNINGS."

и когда я попытаюсь ...strncpy_s- У меня была ошибка:
"Ошибка (активная) E0304 ни один экземпляр перегруженной функции "strncpy_s" не соответствует списку аргументов"

Что я уже пробовал:

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <crtdbg.h>  // For _CrtSetReportMode  
#include <errno.h> 
bool GetWord(char* theString,
	char* word, int& wordOffset);

// driver program
int main()
{
	const int bufferSize = 255;
	char buffer[bufferSize + 1]; // hold the entire string
	char word[bufferSize + 1]; // hold the word
	int wordOffset = 0; // start at the beginning

	std::cout << "Enter a string : ";
	std::cin.getline(buffer, bufferSize);

	while (GetWord(buffer, word, wordOffset))
	{
		std::cout << "Got this word: " << word << std::endl;
	}
	return 0;
}

// function to parse words from a string.
bool GetWord(char* theString, char* word, int& wordOffset)
{
	if (theString[wordOffset] == 0) // end of string?
		return false;

	char *p1, *p2;
	p1 = p2 = theString + wordOffset; // point to the next word

									  // eat leading spaces
	for (int i = 0; i<(int)strlen(p1) && !isalnum(p1[0]); i++)
		p1++;

	// see if you have a word
	if (!isalnum(p1[0]))
		return false;

	// p1 now points to start of next word
	// point p2 there as well
	p2 = p1;

	// march p2 to end of word
	while (isalnum(p2[0]))
		p2++;

	// p2 is now at end of word
	// p1 is at beginning of word
	// length of word is the difference
	int len = int(p2 - p1);

	// copy the word into the buffer
	strncpy(word, p1, len);


	// null terminate it
	word[len] = '\0';

	// now find the beginning of the next word
	for (int j = int(p2 - theString); j<(int)strlen(theString)
		&& !isalnum(p2[0]); j++)
	{
		p2++;
	}

	wordOffset = int(p2 - theString);

	return true;
}

3 Ответов

Рейтинг:
23

Michael Haephrati

Есть 2 возможных решения:
1. Добавить _CRT_SECURE_NO_WARNINGS параметры вашего проекта и использовать функції strncpy();
2. Использование

strncpy_s(word, p1, len);


Badruddin Koronfol

Я уже пробую эти два варианта.

Рейтинг:
20

CPallini

strncpy[^] и strncpy_s[^] имеют разные подписи, а именно strncpy_s требуется размер строки назначения в качестве дополнительного параметра. Следовательно, вы должны были бы назвать это так

strncpy(word, word_size, p1, len);

(и вам придется измениться GetWord подпись соответственно, для того чтобы пройти word_size).

Другой вариант-игнорировать или подавлять предупреждение.


Badruddin Koronfol

Спасибо.
Это работает

CPallini

Добро пожаловать.

Рейтинг:
0

Richard MacCutchan

Вы проверили документацию strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l[^] ?