gpt4 book ai didi

c - 未定义对 gets_s 的引用?

转载 作者:太空宇宙 更新时间:2023-11-04 01:35:31 25 4
gpt4 key购买 nike

我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com