2016-11-22 2 views
-4

Ich erhalte eine Fehlermeldung, dass ich zu wenig Argumente für den Aufruf 'strcpy_s' habe Ich habe es nachgeschlagen und kann keine Antworten finden! Danke im Vorraus für deine Hilfe.Warum erhalte ich diesen Fehler? 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

Die Signatur für 'strcpy_s' ist' strcpy_s (char *, size_t, const char *) ', so dass Sie den' size_t' Parameter einschließen müssen. –

+0

Du hast nachgesehen, aber du hast die Manpage nicht gelesen - deine erste Anlaufstelle. –

+0

Ich weiß ehrlich nicht, was die Manpage ist. Dies ist mein erster Informatikkurs. Ich habe noch nie davon gehört @weather – Crowe

Antwort

0

versuchen, die Größe des Puffers, so dass die Funktion nicht überläuft Angabe:

 strcpy_s(foo, 10, bar); 

MSDN Doc

1

strcpy und strcpy_s haben nicht die gleiche Signatur. Die erstere überschreibt den Speicher, wenn Sie keinen ausreichend großen Zielpuffer zur Verfügung stellen, der spätere gibt einen Fehlercode zurück, wenn die Quellzeichenfolge zu groß ist. So

prüfen here

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

, müssen strcpy_s eine Zielpuffergröße sicher sein, dass es nicht überläuft.

0

Für den Anfang dieser Funktion

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

falsch ist. Wenn i nach der Schleife austritt, auf die diese n Zuordnungsanweisung

str[i] = '\0'; 

versucht gleich außerhalb des Zeichen-Array zu schreiben.

Die Funktion kann auf folgende Weise

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; 
} 

Wie für die Fehlermeldung definiert werden, dann wird die Funktion strcpy_s erfordert drei Parameter und darüber hinaus ist es nicht Zeiger vom Typ char * zurückzukehren. So sind diese Aussagen

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); 

}

sind falsch. Die Funktion strcpy_s wird die folgende Art und Weise erklärt

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

Was Sie brauchen, ist die Funktion strcpy. In diesem Fall in der Tat können Sie zum Beispiel schreiben

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