2016-11-22 3 views
-4

'strcpy_s'에 대한 호출이 너무 적다는 오류가 나타납니다. 나는 이것을보고 찾지 못했습니다! 사전에 도움을 주셔서 감사합니다. 기능하지 않습니다 오버 플로우, 그래서 버퍼의 크기를 지정왜이 오류가 발생합니까? strcpy

#include <stdio.h> 
#include <string.h> 
#define WORD_LENGTH 20 

void read_line(char str[], int n); 

int main(void) 
{ 
char smallest_word[WORD_LENGTH]; 
char largest_word[WORD_LENGTH]; 
char current_word[WORD_LENGTH]; 

printf("Enter word: "); 
read_line(current_word, WORD_LENGTH); 
strcpy_s(smallest_word, strcpy_s(largest_word, current_word)); 

while (strlen(current_word) != 4); 
{ 
    printf("Enter word: "); 
    read_line(current_word, WORD_LENGTH); 
    if (strcmp(current_word, smallest_word) < 0)strcpy_s(smallest_word, 20, current_word); 
    if (strcmp(current_word, largest_word) > 0)strcpy_s(largest_word, 20, current_word); 
} 
printf("\nSmallest word: %s \n", smallest_word); 
printf("Largest word: %s \n", largest_word); 
return 0; 
} 

void real_line(char str[], int n) 
{ 
int ch, i = 0; 
while ((ch = getchar()) != '\n') 
    if (i < n) 
     str[i++] = ch; 
str[i] = '\0'; 
} 
+1

을 위해 쓸 수 있습니다. –

+0

당신은 그것을 보았으나 man page를 읽지는 않았다. –

+0

나는 정직하게 맨 페이지가 무엇인지 모른다. 이것은 내 첫번째 컴퓨터 과학 수업입니다. 나는 그것을 들어 보지 못했습니다. @weather – Crowe

답변

1

strcpy를하고 strcpy_s가 동일한 서명이 없습니다. 소스 코드가 너무 크면 대상 버퍼를 충분히 제공하지 않으면 전자가 메모리를 덮어 쓰고, 나중에는 오류 코드가 반환됩니다. here

char * strcpy (char * destination, const char * source); 
errno_t strcpy_s(char *restrict dest, rsize_t destsz, const char *restrict src); 

확인 그래서, strcpy_s는 오버 플로우를하지 않는 것을 확인하기 위해 대상 버퍼 크기가 필요합니다.

0

우선은이 기능

void real_line(char str[], int n) 
{ 
int ch, i = 0; 
while ((ch = getchar()) != '\n') 
    if (i < n) 
     str[i++] = ch; 
str[i] = '\0'; 
} 

가 잘못된 것입니다. i 경우 루프를 종료 한 후 문자 배열 밖에 쓸 n은이 할당 문

str[i] = '\0'; 

시도와 동일합니다.

기능

다음 기능 strcpy_s는 세 개의 매개 변수를 필요로하며, 또한이 유형 char *의 포인터를 반환하지 않는 오류 메시지에 관해서는 다음과 같은 방법을

int real_line(char s[], int n) 
{ 
    int ch, i = 0; 

    if (!(n < 1)) 
    { 
     while (i < n - 1 && (ch = getchar()) != '\n') s[i++] = ch; 
     str[i] = '\0'; 
    } 

    return i; 
} 

을 정의 할 수 있습니다. 따라서 이러한 진술

strcpy_s(smallest_word, strcpy_s(largest_word, current_word)); 
//... 
if (strcmp(current_word, smallest_word) < 0)strcpy_s(smallest_word, 20, current_word); 
if (strcmp(current_word, largest_word) > 0)strcpy_s(largest_word, 20, current_word); 

}

잘못이다. 기능 strcpy_s는 다음과 같은 방법으로

errno_t strcpy_s(char * restrict s1, rsize_t s1max, const char * restrict s2); 

당신이 필요로하는 기능 strcpy입니다 선언됩니다. 당신은`size_t` 매개 변수를 포함 할 필요가 있으므로이 경우에는 실제로 strcpy_s``에 대한 서명이`strcpy_s (숯불 *, size_t로, CONST의 char *)`예를

strcpy(smallest_word, strcpy(largest_word, current_word));