C语言入门(字符串正反连接(fgets()、gets()用法))

发布时间:2023年12月19日

目录

?编辑

题目描述

输入格式

输出格式

样例输入

样例输出

解题思路


题目描述

所给字符串正序和反序连接,形成新串并输出

输入格式

任意字符串(长度<=50)

输出格式

字符串正序和反序连接所成的新字符串

样例输入

123abc

样例输出

123abccba321

解题思路

输入字符串,把它的逆序字符串存放在原字符串后面,然后输出;

注意事项:
放在原字符串后面时,要从第lenth-1的位置开始放,直到原字符串第一个字符放入为止;

即:

for( i=strlen(a),j=strlen(a)-1; j>=0; i++,j--)
{
  a[i]=a[j];
}

最后要加上' \0';

有一种的思路是,循环不是以原字符串第一个字符结束,而是以原字符串长度的两倍-1结束,

即:(下面这样是不对的,因为a[ strlen(a) ]原来是' \0', 被放字符后,求出长度不对,并且a的长度在改变)

for( i=strlen(a),j=strlen(a)-1; i<2*strlen(a); i++,j--)
{
  a[i]=a[j];
}

代码示例:

#include <stdio.h>
#include <string.h>
int main()
{
    char a[101];
    int i, j = 1;
    gets(a);
    for(i = strlen( a ), j = strlen( a ) - 1; j >= 0; i++, j--)
    {
      a[i] = a[j];
    }
    a[i] = '\0';
 
    puts(a);
    return(0);
}

????????对于上述代码,我们可以再dev C++中正常运行,但是如果我们将该代码放到Visual Studio中进行编辑,会发现

    gets(a);

报错,这是因为在C语言中,gets(a)用于从标准输入(键盘)获取一行字符串,并将其保存到字符数组a中。它是一个不安全的函数,因为它无法防止输入的字符串超过目标字符数组的大小,可能导致缓冲区溢出。由于gets()存在安全性问题,它已被标记为不推荐使用,并在C11标准中被移除。

使用gets(a)时,需要注意以下几点:

  1. 字符数组a必须足够大以容纳输入的字符串,包括字符串的结尾空字符\0
  2. 如果输入的字符串长度超过了字符数组的大小,会发生缓冲区溢出,导致未定义的行为。
  3. gets()函数不提供任何限制或验证输入的能力,因此要确保输入的字符串长度不会超过目标字符数组的大小。

????????在现代C编程中,推荐使用更安全的函数fgets()替代gets(),因为fgets()可以指定最大读取的字符数,避免缓冲区溢出问题。

??fgets()函数用于从输入流中读取一行字符串,并将其保存到指定的字符数组中。它提供了更安全的方式来读取字符串,因为你可以指定最大读取的字符数,避免缓冲区溢出问题。

fgets()函数的原型如下

char* fgets(char* str, int num, FILE* stream);

参数说明:

  • str:指向目标字符数组的指针,用于保存读取的字符串。
  • num:要读取的最大字符数(包括结尾的换行符和空字符)。
  • stream:要读取的输入流,通常使用stdin表示标准输入。

??fgets()函数的返回值是一个指向目标字符数组的指针,如果读取成功,则返回str;如果发生错误或到达文件末尾,则返回NULL

#include <stdio.h>
#include <string.h>
int main()
{
    char a[101];
    int i, j = 1;
    fgets(a, sizeof(a), stdin);

    for (i = strlen(a), j = strlen(a) - 1; j >= 0; i++, j--)
    {
        a[i] = a[j];
    }
    a[i] = '\0';

    puts(a);
    return(0);
}

????????不过在使用fgets()我们又会发现,最终结果成这样

????????那是因为fgets()函数将包括换行符\n在内的输入一并读取到字符数组中,因此如果你想去掉换行符,可以使用字符串处理函数strcspn()或手动处理字符串。

最终代码:

#include <stdio.h>
#include <string.h>
int main()
{
    char a[101];
    int i, j = 1;
    fgets(a, sizeof(a), stdin);
   
    // 去掉换行符
    a[strcspn(a, "\n")] = '\0';

    for (i = strlen(a), j = strlen(a) - 1; j >= 0; i++, j--)
    {
        a[i] = a[j];
    }
    a[i] = '\0';

    puts(a);
    return(0);
}

Visual Studio编辑器中C4996 ‘scanf‘: This function or variable may be unsafe.问题解决方案-CSDN博客

C语言练习(检查一个数是否为质数 、剪绳子)-CSDN博客

文章来源:https://blog.csdn.net/MANONGDKY/article/details/135056555
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。