为什么我会收到此错误?的strcpy

时间:2016-11-22 20:36:25

标签: c strcpy

我收到一条错误,指出调用'strcpy_s'的参数太少 我查了一下,找不到任何答案!感谢您的帮助。

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

4 个答案:

答案 0 :(得分: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需要一个目标缓冲区大小,以确保它不会溢出。

答案 1 :(得分:0)

尝试指定缓冲区的大小,以便函数不会溢出:

        strcpy_s( foo, 10, bar );  

MSDN Doc

答案 2 :(得分:0)

protected def registry: Seq[aClass: Class[A], serializer: Serializer[A]] = ... def optionals = Seq("field3") final def register(kryo: Kryo) = { optionals.foreach { optional => kryo.getContext.asInstanceOf[ObjectMap[Any, Any]].put(optional, true) } registry.foreach { registrable => kryo.register(registrable.aClass, registrable.serializer) } } 还需要strcpy_s参数,请参阅:

size_t

来源:https://msdn.microsoft.com/de-de/library/td1esda9.aspx

答案 3 :(得分: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';

尝试在字符数组外写字。

该功能可以通过以下方式定义

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需要三个参数,而且它不返回类型char *的指针。因此这些陈述

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。在这种情况下,您确实可以编写例如

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