gets_s函数如何解决非法输入问题
时间: 2023-12-25 19:06:39 浏览: 84
gets_s 函数主要是为了解决 gets 函数的安全性问题,而并不是针对非法输入问题。因此,gets_s 函数不能直接解决非法输入问题。
如果要解决非法输入问题,可以对输入进行验证和过滤,以确保输入的数据符合要求。例如,可以使用正则表达式检查输入是否符合特定的格式要求,或者使用特定的函数来验证输入的数据类型。
另外,可以考虑使用具有更好输入控制功能的函数,例如 fgets 函数,它可以指定要读取的字符数,以避免缓冲区溢出的问题。或者使用 C++ 标准库中的 getline 函数,它可以读取一行字符,并自动调整存储区大小以适应输入的数据。
相关问题
c语言编写函数,从字符串src中复制第begin个字符开始的连续cnt个字符构成新字符串trg。 函数接口定义: void substr(char src[],int begin,int cnt,char trg[]); 裁判测试程序样例: #include <stdio.h> #include <string.h> void substr(char src[],int begin,int cnt,char trg[]); int main() { char s[81],d[81]; int b,c; gets(s); scanf("%d%d",&b,&c); if(b<0 || c<0 || b+c>strlen(s)) printf("Invalid data"); else { substr(s,b,c,d); puts(d); } } /* 请在这里填写答案 */ 输入样例: student 2 3 输出样例: ude
以下是函数实现代码:
```c
void substr(char src[], int begin, int cnt, char trg[]) {
int len = strlen(src);
if (begin < 0 || cnt < 0 || begin + cnt > len) { // 判断参数是否合法
trg[0] = '\0'; // 如果不合法,将目标字符串置为空字符串
return;
}
for (int i = 0; i < cnt; i++) {
trg[i] = src[begin + i]; // 从源字符串中复制指定字符到目标字符串
}
trg[cnt] = '\0'; // 目标字符串结尾
}
```
函数的思路是从源字符串 `src` 中复制第 `begin` 个字符开始的连续 `cnt` 个字符到目标字符串 `trg` 中。需要注意的是,要先判断传入的参数是否合法:如果 `begin` 或 `cnt` 小于 0,或者 `begin + cnt` 超出了源字符串的范围,就不合法。如果非法,则将目标字符串置为空字符串。如果合法,则可以开始复制操作。遍历源字符串中的指定范围,将每个字符复制到目标字符串中即可。在目标字符串的结尾处添加一个字符 `\0` 以表示字符串的结束。
#include<stdio.h> #include<string.h> #include<stdlib.h> int main() { char *s[80]; char *a[80]; gets(s); int i,j; j=strlen(s); for(i=j-1;i>0;i--) { printf("%s",a[i]); } if(strcmp(s[80],a[80])==0) printf("yes"); else printf("No"); int strcmp(char *a, char *s); return 0; } 判断字符是否是回文 “回文”是一种顺序读和反序读都一样的字符串,例如:“121”“abcba” “ABCCBA”编写程序,判断任一字符串是否为回文。 相关知识 通过指针来传递参数 使这串代码符合题目要求
好的,我来解释一下这段代码的问题,并且修改它使其符合题目要求。
首先,这段代码有几个问题:
1. `char *s[80];` 和 `char *a[80];` 定义了两个指针数组,但是没有初始化,也没有给它们分配内存空间,所以会导致程序运行时出现非法内存访问的问题。
2. `gets(s);` 接收用户输入的字符串会导致缓冲区溢出的问题,所以应该使用更安全的函数 `fgets`。
3. `printf("%s",a[i]);` 输出字符数组要加上 `%s` 的格式化字符串,而且要输出一个字符数组的话,应该是 `printf("%s", a);` 而不是 `printf("%s", a[i]);`。
4. `strcmp(s[80],a[80])` 这个比较是错误的,因为 `s[80]` 和 `a[80]` 都是未初始化的指针数组的第 81 个元素,应该改为 `strcmp(s,a)`。
5. 代码中没有实现判断回文的功能。
下面是修改后的代码:
```
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char s[80];
char a[80];
fgets(s, 80, stdin);
int i, j = strlen(s) - 1;
for (i = 0; i <= j; i++) {
if (s[i] >= 'A' && s[i] <= 'Z') {
a[i] = s[i] + 32; // 大写字母转化为小写字母
} else {
a[i] = s[i];
}
}
for (i = 0; i <= j; i++) {
if (a[i] != a[j - i]) {
printf("No");
return 0;
}
}
printf("Yes");
return 0;
}
```
这个代码将用户输入的字符串转化为小写字母后,使用双指针的方法判断是否为回文,并输出结果。
阅读全文