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