黑马程序员技术交流社区

标题: 关于C语言的一个问题 [打印本页]

作者: 小小歪    时间: 2015-7-26 23:17
标题: 关于C语言的一个问题
在C语言中输入字符串我使用gets()函数,虽然能运行但是一直报警告,求一种新的方法,我知道能自定义函数的方法,但是不是太会,请大神给个例子,求讲解

作者: xiaochongzi    时间: 2015-7-26 23:17
望采纳scanf或者fgets   fwrite都能替代啊
相信scanf你应该懂得,不多说   
当输入字符串的时候,我们会用到gets()函数。编译时会给一个警告,所以很不爽,哈哈哈,因为gets函数在输入时没有限定字符串的长度,这是不安全的
sacnf函数和fgets都能很好的替代
scanf不多说,fgets替代gets()的话举个例子吧
char string[length];
fgets(string,length,stdin);
       数组名,长度,和指针
基础视频Day 14 会讲到的
作者: 小小歪    时间: 2015-7-27 00:39
?怎么没人啊,难道我的问题很小白?
作者: LSwbfil2015    时间: 2015-7-27 10:36
视频里不是说这个警告是默认去不掉而且不影响程序运行的吗?
作者: yuezuiqingfeng    时间: 2015-7-27 12:58
那就用scanf或者fwrite呗
作者: alanwangke213    时间: 2015-7-27 13:56
想要获得字符串,可以用scanf啊。定义一个字符数组或者字符串指针: char st[20];然后用scanf("%s",st);这样可以,等你后面学到Objective-C的时候直接用NSString * st = @"XXXXX";这样就可以了,不过得用NSLog(@"%@",st);来输出。如果觉得好请采纳哦~
作者: 小林儿    时间: 2015-7-27 22:37
我只知道scanf可以代替:lol
作者: wx_pNOonoEG    时间: 2015-7-27 22:42
把头文件换成 #include <string.h>试试
作者: 小小歪    时间: 2015-7-28 00:04
void getString(char str[], int length) {
    int i = 0;
    while (1) {
        if (i == length - 1) {
            str[i] = '\0';  
            break;
        }
        char c = getchar(); // 从缓存中获取一个字符
        if (c == '\n') {
            str[i] = '\0';
            break;
        }  
        str[i] = c;
        i++;
    }
}

终于把这个函数弄懂了
作者: fudanxiaoan    时间: 2015-7-28 21:56
估计你遇到的事:not safe 的警告    由于gets()无法知道字符串的大小,必须遇到换行字符或文件尾才会结束输入,因此容易造成缓存溢出的安全性问题。建议使用fgets()取代#include <stdio.h>
int main(void)
{
char a;
char name[3];
char b;
  scanf("%c",&a);
   printf("a:%c\n",a);            //第一次输出a的值
  getchar();
gets(name);    //这里你第一次假设读取abc 第二次读取this is text 试一下(大于3个字符的都行)
scanf("%c",&b);               
printf("name:%s;\na:%c;\nb:%c;\n",name,a,b);    //输出所有的值,注意a
}
由于我们把字符串改成了“this is a text”然后a的值莫名其妙的被替换了。紧接着编译器不能正常工作了。
在不正确使用gets()函数的时候造成的危害是很大的,就像我们刚才看到的那样,a的值被字符串name溢出的值给替换了。我想这并不是你想要的结果吧!出于安全,用fgets()来代替gets()吧!

作者: 1312878967    时间: 2015-7-28 23:50
好多大神!!!
作者: QQ2544    时间: 2015-8-1 22:04
跟着也学习了
作者: KongPro    时间: 2015-8-3 22:29
scanf函数就可以吧,但是要注意接收的类型,然后scanf里面要对应格式。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2