2014-04-01 2 views
0

이 알고리즘을 사용하여 문자열을 배열로 변환하려고했습니다. 문제는 다음과 같습니다. strcpy가 작동하지 않습니다. 문자열을 배열로 변환하면 strcpy가 작동하지 않습니다.

는 또한 시도 : strcpy_s 를 strncpy 방어 적이기 ->를이 함수 내 배열
string tmp; 
getline(cin, tmp); 
char* messaggio = new char[tmp.size()]; 
ZeroMemory(messaggio, tmp.size()); 
strcpy(messaggio, tmp.c_str()); 

tmp.resize(NULL); 

난 비주얼 스튜디오 2013를 사용하여 ... 단지 첫번째 단어를 (왜 몰라) 인쇄 할 수 있습니다 ... strcpy를 사용할 때 이상한 오류가 발생합니다. C4996은 안전하지 않을 수 있습니다. strcpy_s로 시도하면 strncpy와 동일합니다 ...

+0

입니다 C4996 컴파일 오류입니다. 컴파일 오류가 발생하거나 예기치 않은 런타임 출력이 나타납니다.둘 다 다른 문제입니다. –

+0

컴파일 오류 (C4496)에 대해서는이 기능을 비활성화하는 방법을 읽었습니다. http://msdn.microsoft.com/en-us/library/ttcz0bys.aspx –

+0

@tmp 오류입니까 아니면 그냥 경고입니까? –

답변

0

[SOLVED]

들으, expecially에에 "모스크바에서 블라드"는 인쇄 만 1 말과 2에 대해 언급 한 3

std::string tmp; 
     tmp.resize(0); 
     std::getline(std::cin, tmp); 
     char* messaggio = new char[tmp.size()+1]; 

     strcpy_s(messaggio, tmp.size()+1, tmp.c_str()); 

     send(ConnectSocket, messaggio, tmp.size()+1, NULL); //Send 2 

     tmp.resize(0); 
     delete messaggio; 
2

코드에서 하나의 문제는 null 종료를 제외한 문자 수를 제공한다는 것입니다. 따라서 messagio에는 널 종료 문자열에 충분한 공간이 없으며 strcpy은 해당 경계를 넘어 쓰기를 시도합니다.

경고는 strcpy이 (가) 밖으로 나가기 쉽도록하기위한 것입니다. 소스 문자열의 길이가 대상 버퍼의 길이보다 큰 경우 정의되지 않은 동작이 발생합니다. 제안 된 대안은 자신을 보호 할 수있는 방법을 제공합니다 (그러나 100 % 바보가 아닙니다).

당신이 원하는 것은 다음 문자열이 작업을 수행 할 수있는 관용적 방법의 문자를 포함하는 배열과 같은 객체가 벡터 사용되는 경우

: 당신이 정말로 문자열을 원하는 경우,

std::vector<char> messagio(tmp.begin(), tmp.end()); 

std::string을 사용하십시오.

+0

또 다른 코드는 필연적으로 메모리를 누설한다는 것입니다. C 스타일 문자열에'std :: vector '을 사용해야합니다. –

+0

ur 도움에 대한 thx하지만 내 prob 문자열이 아니라 배열이 ... infact 문자열, 벡터, 목록 ... 배열, 역방향 ... 넣을 필요가 – user3464250

+0

@ user3464250하지만 왜 그렇게해야만 해? 귀하의 질문에서 명확하지 않다, 그래서 당신이 실제로 그것을 필요로하지 않을 수 있습니다. – juanchopanza

0

오류는 실제로 오류가 아닙니다. 경고입니다. 어쩌면 컴파일러가 모든 경고를 오류로 간주하도록 컴파일러의 옵션을 설정했을 수도 있습니다.

코드에 버그가 있습니다. 할당 된 배열의 크기는

std::string tmp; 
std::getline(std::cin, tmp); 

char* messaggio = new char[tmp.size() + 1]; 
std::strcpy(messaggio, tmp.c_str()); 

를 작성해야 종단 제로 기능 그래서 std::strcpy

에서 사용 수용 할 수있는 문자열의 크기에 1을 더한한다 또는 당신은 쓸 수

strcpy_s(messaggio, tmp.size() + 1, tmp.c_str()); 

이지만 기능 strcpy_s은 표준 C++ 기능이 아닙니다. 이것은 C 표준에만 존재합니다.

이 경고를 무시해야합니다.

컴파일러가 std::dynarray 클래스를 지원하는 경우 원시 포인터 대신 사용할 수 있습니다. 예를 들어

전혀

std::dynarray<char> messagio(tmp.size() + 1); 
std::strcpy(messagio.data(), tmp.c_str()); 
+0

"안녕하세요"감사를 인쇄하지만 문제는 여전히 DynArray를 내가 사용 후 어쨌든 내가 포인터의 원인을 필요로 ... 내가 생각하는 지원되지 않습니다 ...에있다 매개 변수로 포인터를 사용하는 기능. \t for (;;) { \t \t std :: string tmp; \t \t std :: getline (std :: cin, tmp); \t \t char * messaggio = new char [tmp.size() + 1]; \t \t ZeroMemory (messaggio, tmp.size() +1); \t \t std :: strcpy (messaggio, tmp.c_str()); \t \t send (ConnectSocket, messaggio, tmp.size(), NULL); \t \t tmp.resize (NULL); \t} – user3464250

+0

당신이 무슨 문제에 대해 말하고 있는지 이해하지 못했습니다.> 제 예제에서 그러한 호출이 없을 때 ZeroMemory를 사용하는 이유는 무엇입니까? 함수에서 temp.size() 또는 tmp.size() + 1을 보내려면 어떤 값을 사용해야합니까? –

+0

ZeroMemory를 사용하지만 ZeroMemory를 사용하지 않고 tryed하지만 ... 나는 또한 다른 프로젝트 (이와 비슷한)를 가져 와서 메뉴의 옵션이 같은지 확인합니다. 내가 집으로 돌아 가면 더 많은 관심을 보일 것이다. 그러나 옵션이 괜찮다고 생각한다. ..... 또한 tmp.size()와 tmp.size() + 1을 사용하여 tryed를했을 때, 아무것도 변경하지 않았다. :/:/:/:/ – user3464250