我在Ubuntu 4.6.1和suse4.6.2上使用gcc,命令如下

gcc gets_s.c

我的源代码是
// Read and Display Lines
// gets_s.c

#include <stdio.h>

int main(void)
{

    char first_name[11];
    char last_name[11];

    printf("First Name : ");
    gets_s(first_name, 11);
    printf("Last Name  : ");
    gets_s(last_name, 11);
    puts(first_name);
    puts(last_name);

    return 0;

}

详细阐述我的问题:
我的主要问题是行输入和行保存之间的一一对应。
在成功时,fgets和gets的区别在于fgets包含换行符,而gets用空结束符替换换行符,以便在换行输入和成功调用gets之间保持一对一的对应关系。
对于溢出缓冲区长度的输入,fgets接受适合缓冲区的字符数,并将其余字符留在输入缓冲区中以供下一个fgets使用。
标准(K.3.5.4.1)规定,与gets不同,with gets需要在n-1个字符内有换行符、EOF或读取错误。因此溢出是运行时约束冲突。如果存在运行时约束冲突,则将缓冲区中的第一个字符设置为空字符,并读取和丢弃stdin输入缓冲区中的字符,直到读取新行字符、发生文件结尾或发生读取错误。
因此,关于成功,我期望:
>fgets

First Name : Chris
Last Name  : Szalwinski
Chris

Szalwinski

>

>gets_s
First Name : Chris
Last Name  : Szalwinski
Chris
Szalwinski
>

在溢出时,我希望fgets的行为与fgets的不同,换言之,
>fgets
First Name : Christopher
Last Name  : Christophe
r


>

>gets_s
First Name : Christopher
Last Name  : Szalwinski

Szalwinski

>

请注意我希望得到的结果是如何完全删除第一行输入的内容。
如果主要问题是输入行和保存行之间的一一对应,这在调试中很重要,我们仍然需要编写自己的函数(类似于K&R的getline)
char *gets_s(char *s, int n)
{
    int i, c;
    for (i = 0; i < n - 1 && (c = getchar()) != EOF && c != (int)'\n'; i++)
        s[i] = c;
    s[i] = '\0';
    while (n > 1 && c != EOF && c != (int)'\n')
        c = getchar();
    return c != EOF ? s : NULL;
}

有了这样一个功能,一对一的通信得以保持,缓冲区是
饱和,不存在运行时约束冲突。
我得出这个结论是对的吗。

最佳答案

你试过通过`-std=c11'吗?
根据this page,C11引入了gets_s。假设您使用的是GCC,那么可以使用“-std=C11”选项启用有限的C11支持。

关于c - 未定义对gets_s的引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15149168/

10-15 04:53