C prime plus s_gets 记录()

 1 char *s_gets(char *st, int n)  
 2 {  
 3     char *ret_val;  
 4     char *find;  
 5     ret_val = fgets(st, n, stdin);    // 从stdin中读取n-1个字符
 6     if(ret_val)  
 7     {  
 8         find = strchr(st, '\n');    // 查找换行符
 9         if(find)  
10         {  
11             *find = '\0';  
12         }  
13         else  
14         {  
15             while(getchar() != '\n')  
16                 continue;  
17         }  
18     }  
19     return ret_val;  
20 }  

以上是s_gets的原形

内部函数分析 :

fgets()

使用gets()时也可以完成输入 但是gets()不检查预留存储区能容纳的大小 所以 会发生内存越界,因此建议用fgets()

/**
 * @brief fgets()函数获取一整行输入:
 *          读取输入直达换行符(换行符也被读取),或者读到文件结尾,或者读取(n-1)个字符
 *          读取完成后,再在读取内容末尾添加空字符'\0',使读取内容成为一个字符串
 * @param str 指向一个字符数组,该数组存储了要读取的字符串。
 * @param n 这是要读取的最大字符数
 * @param stream FILE*指针,指明要读入的文件,如果是键盘输入,则以stdin(标准输入)作为参数
 * @return char* 如果返回成功,则返回值与char* str参数相同,如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针
 *               如果发生错误,返回一个空指针。
 */
char *fgets(char *str, int n, FILE *stream)
# include <stdio.h>
int main(void)
{
    char str[20];  /*定义一个最大长度为19, 末尾是'\0'的字符数组来存储字符串*/
    printf("please input:");
    fgets(str, 7, stdin);  /*从输入流stdin即输入缓冲区中读取7个字符到字符数组str中*/
    printf("%s\n", str);
    return 0;
}

  输出的结果是6个字符串,还有一个是结束字符 \0.

s_gets所做的是将回车找出转换为字符串结尾标志\0 便于输出结果。

else中的意思是键盘输入若大于n-1 st存储了n-1个字符后 加上\n 就是一个字符串 此时在IO缓冲区中还存在着没被st存储的剩余字符 如果不处理这些字符 在下一次读取中 会从缓冲区中读出这些字符

————————
 1 char *s_gets(char *st, int n)  
 2 {  
 3     char *ret_val;  
 4     char *find;  
 5     ret_val = fgets(st, n, stdin);    // 从stdin中读取n-1个字符
 6     if(ret_val)  
 7     {  
 8         find = strchr(st, '\n');    // 查找换行符
 9         if(find)  
10         {  
11             *find = '\0';  
12         }  
13         else  
14         {  
15             while(getchar() != '\n')  
16                 continue;  
17         }  
18     }  
19     return ret_val;  
20 }  

以上是s_gets的原形

内部函数分析 :

fgets()

使用gets()时也可以完成输入 但是gets()不检查预留存储区能容纳的大小 所以 会发生内存越界,因此建议用fgets()

/**
 * @brief fgets()函数获取一整行输入:
 *          读取输入直达换行符(换行符也被读取),或者读到文件结尾,或者读取(n-1)个字符
 *          读取完成后,再在读取内容末尾添加空字符'\0',使读取内容成为一个字符串
 * @param str 指向一个字符数组,该数组存储了要读取的字符串。
 * @param n 这是要读取的最大字符数
 * @param stream FILE*指针,指明要读入的文件,如果是键盘输入,则以stdin(标准输入)作为参数
 * @return char* 如果返回成功,则返回值与char* str参数相同,如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针
 *               如果发生错误,返回一个空指针。
 */
char *fgets(char *str, int n, FILE *stream)
# include <stdio.h>
int main(void)
{
    char str[20];  /*定义一个最大长度为19, 末尾是'\0'的字符数组来存储字符串*/
    printf("please input:");
    fgets(str, 7, stdin);  /*从输入流stdin即输入缓冲区中读取7个字符到字符数组str中*/
    printf("%s\n", str);
    return 0;
}

  输出的结果是6个字符串,还有一个是结束字符 \0.

s_gets所做的是将回车找出转换为字符串结尾标志\0 便于输出结果。

else中的意思是键盘输入若大于n-1 st存储了n-1个字符后 加上\n 就是一个字符串 此时在IO缓冲区中还存在着没被st存储的剩余字符 如果不处理这些字符 在下一次读取中 会从缓冲区中读出这些字符