分配空间

假设编写如下的代码

char *name ;

scanf("%s",name);

warning:读入name时,name可能会擦写程序中的数据会代码,从而导致程序异常终止,此时的参数name是个未初始化的指针

最简单的的方法是,在声明显式指明数组的大小

char name [81];

 

不幸的gets() 函数

gets() 函数读取整行输入,直至遇到换行符,然后丢弃换行符,储存其余字符,并在这些字符末尾添加一个空字符使其成为一个C的字符串

char words[40];

gets(words);

问题 gets() 函数唯一的参数是words,它无法检查数组能否装得下输入行

C11 直接从标准中废除gets() 函数

 

fgets() 函数

fgets() 函数的第二个参数指明了读入字符的最大数量 如果该参数是n,那么该函数读入N—1个字符,或者读到遇到的第一个换行符为止

如果fgets() 函数读到一个换行符,会把它存储在字符串中

fgets() 函数的第三个参数指明要读入的文件。如果读入从键盘输入的数据,则以 stdin (标准输入)作为参数

缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。函数成功将返回的地址与传入的第一个参数相同,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。

 

s_gets() 函数

char *s_gets(char *st, int n)
{
    char *ret_val;
    int i=0;
    ret_val = fgets(st,n,stdin);
    if (ret_val)       // 即,ret_val != NULL
    {
        while(st[i] !='\n' && sr[i] != '\0')
        i++;
        if(st[i] == '\n')
            st[i]=='\0';
        else
            while(getchar() != '\n')
                        continue;
    }
    return ret_val;
}

如果fgets() 返回NULL,说明读到文件结尾或出现读取错误

丢弃过长输入行中的余下字符,输入行中多出来的字符会被留在缓冲区,成为下一次读取语句的输入。丢弃输入行余下的字符保证了读取语句与键盘输入同步

s_gets() 函数 最严重的缺陷是遇到不合适的输入毫无反应,丢弃多余的字符时。既不通知程序也不告知用户

 

字符串输出

puts()函数只需把字符串的地址作为参数传递给它即可,puts()函数在输出的末尾添加换行符

fputs()函数的第2个参数指明要写入数据的文件  如果要打印在显示器上,可以定义在stdio.h 的stdout(标准输出)作为该参数

fputs()函数不会再输出的末尾添加换行符,与fgets()函数配套使用