c - 未定义对 gets_s 的引用?

标签 c c11 tr24731

我在 Ubuntu 4.6.1 和 SUSE 4.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_s 的区别在于fgets 包含换行符,而gets_s 将换行符替换为空终止符,以保持输入的行与成功调用gets_s 之间的一一对应关系。

对于溢出缓冲区长度的输入,fgets 接受适合缓冲区的字符数,并将其余字符留在输入缓冲区中以供下一个 fgets 使用。

标准 (K.3.5.4.1) 声明使用 gets_s(与 gets 不同)需要一个换行符、EOF 或 n-1 个字符内的读取错误。因此,溢出是一种运行时约束违规。如果违反运行时约束,则缓冲区中的第一个字符设置为空字符,并读取并丢弃标准输入缓冲区中的字符,直到读取换行符,发生文件结束或发生读取错误。

因此,对于成功,我预计:

>fgets

First Name : Chris
Last Name  : Szalwinski
Chris

Szalwinski

>

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

在溢出时,我预计 fgets 和 gets_s 会有不同的行为。换句话说,

>fgets
First Name : Christopher
Last Name  : Christophe
r


>

>gets_s
First Name : Christopher
Last Name  : Szalwinski

Szalwinski

>

请注意我是如何期望 gets_s 完全删除第一行输入的内容的。

如果主要问题是lines input和lines saved一一对应,这对调试很重要,我们还是要自己写函数(类似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 , gets_s 是在 C11 中引入的。假设您使用的是 GCC,您可以使用“-std=c11”选项启用有限的 C11 支持。

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

相关文章:

c - puts 是可重入的吗?

带有结构参数的 C 函数原型(prototype)

c - c11 _Generic 通用关联的结果表达式的每个分支是否都必须有效?

c - 是否可以在编译时确定实现是否提供精确宽度的整数类型?

c - C 中的 Visual Studio 错误,0xfefefefe 处未处理的异常

c - 从 Rust FFI 访问 DPDK 中的静态 C 函数

c - 在 C 中写入大量文件后 Ubuntu 死机

c - 如何在C中存储不同类型的数据?

c - scanf 和 scanf_s 的区别

c - 对 `scanf_s' 的 undefined reference