C++ gets函数与strlen函数详解

引言

今天在看y总视频师对下面这串代码颇感兴趣:

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
    char s[1000];
    gets(s);
    int n = strlen(s);
    for (int i = 0; i < n; i++)
    {
        int j = i;
        while (j < n && s[j] != ' ')
        {
            j++;
        }
        for(int k = i; k < j; k++)
        {
            cout<<s[k];
        }
        cout<<endl;
    }
}

这段代码有两个点引起了我的注意:

1.gets函数
2.strlen函数

于是乎我上百度查了这两个函数的具体作用,得出结果如下:

一、gets函数

1.功能介绍
gets() 是 c++语言中用来输入一行字符串的函数,其原型为 char *gets( char *s )。该函数会一次性读入一行字符串,遇到换行符’\n’结束读入,并且会将读入的’\n’替换为’\0’。gets() 函数的参数是字符型指针,代表着要输入的字符串的首地址。
2.优点
①适用于输入较短的字符串,比如名字、年龄等。gets() 可以轻松地输入并存储短字符串,而不需要使用字符串缓冲区。
②gets() 很容易理解和使用,因为它是默认的 c++函数,不需要额外的库或工具。
③输入字符型数据时,gets() 比其他输入函数速度更快,因为它不需要将字符转换为数字,也不需要识别负号。
3.缺点
①gets() 不能输入超过字符数组大小的字符串,因为这会导致内存溢出,这是因为 gets() 函数没有将内存大小指定为输入字符的长度。
②输入未知长度的字符串时,使用 gets() 函数时需要小心。如果输入的字符串长度超出了字符数组的大小,则不仅会导致内存泄漏,而且还会破坏原来存储在该位置的数据。
③gets() 函数无法检查输入字符串的大小,因此输入的字符串可能会包含不安全的格式,例如格式字符串漏洞或缓冲区溢出漏洞。
示例代码:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
    char str[20];
    cout<<"请输入一个字符串:";
    gets(str);
    cout<<"您输入的字符串为:"<<str;
}

二、strlen函数

strlen函数是属于string.h库当中的,使用时记得调用该库。
1.strlen(const cr *s)返回的是字符串的长度。获得的是有效字符的长度,不包括末尾的结束符’\0’。
strlen函数的原型是:
unsigned int strlen(const char *str)
{
    assert(str != Null);
    unsigned int len = 0;
    while (*str++)
    {
        len++;
    }
    return len;
}
2.与sizeof的区别
sizeof是一个运算符,表示求对象在内存中占用的字节数。对于字符串求sizeof,则字符串末尾的‘\0’也要计算在内,占一个字节。
sizeof运算符参数可以是任何对象。而strlen函数的参数必须是const char*类型。
3.例子分析,下面是用strlen和sizeof的代码分析
#include <iostream>
using namespace std;
 
int main()
{
    char str[] = "hello,world";
    char name[20] = "Jenny";
    char *ch = "hello";
    int len1 = strlen(str);
    int len2 = strlen(name);
    int len3 = strlen(ch);
    cout << "strlen:字符串长度 " << endl;
    cout << "str: " << len1 << endl;
    cout << "name: " << len2 << endl;
    cout << "ch: " << len3 << endl;
    cout << "sizeof: 内存字节数" << endl;
    cout << "str: " << sizeof(str) << endl;//这里对字符串末尾的\0是占用内存字节的,所以用sizeof求字节数比字符串长度大1.
    cout << "name: " << sizeof(name) << endl;
    cout << "ch: " << sizeof(ch) << endl;//因为ch是指针,指针是地址,是占用32位,也就是4个字节。与指针是何类型无关
 
    return 0;
}
输出结果:

在这里插入图片描述

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 我可以为您提供以下C语言函数的程序: #include <stdio.h> int main() { char str[100], sub[100]; int i, j, l, l1, l2; printf("\n请输入一个字符串:"); gets(str); printf("\n请输入要提取的字符串:"); gets(sub); l1 = strlen(str); l2 = strlen(sub); for (i = 0; i < l1;) { j = 0; l = i; while ((str[l] == sub[j])) { l++; j++; } if (j == l2) { printf("提取的字符串在原字符串中的位置:%d\n", i + 1); i = l; } else i++; } return 0; } ### 回答2: 要编写一个提取C语言函数的程序,需要以下几个步骤: 1. 打开C语言源代码文件。 2. 逐行读取源代码文件的内容。 3. 通过分析每行代码的结构和关键字,判断是否为函数定义。 4. 如果是函数定义,则提取函数名、返回类型、参数列表等信息。 5. 将提取到的函数信息保存到一个数据结构中,如数组或链表。 6. 继续读取并分析源代码的下一行,直到文件结束。 7. 关闭源代码文件。 8. 输出保存的函数信息。 具体实现的代码如下: ```c #include <stdio.h> #define MAX_FUNCTIONS 100 #define MAX_NAME_LENGTH 50 struct Function { char name[MAX_NAME_LENGTH]; char returnType[MAX_NAME_LENGTH]; char parameters[MAX_NAME_LENGTH]; }; int main() { FILE *sourceFile; sourceFile = fopen("source.c", "r"); // 替换为你的源代码文件名 if (sourceFile == NULL) { printf("无法打开源代码文件。\n"); return 1; } struct Function functions[MAX_FUNCTIONS]; int functionCount = 0; char line[100]; while (fgets(line, sizeof(line), sourceFile)) { // 分析每行代码,判断是否为函数定义 // 假设函数定义的格式为:返回类型 函数名(参数列表) // 这只是一个简单示例,你可能需要根据实际情况进行修改 if (strstr(line, "(") != NULL && strstr(line, ")") != NULL) { struct Function function; sscanf(line, "%s %[^ (] %[^\n]", function.returnType, function.name, function.parameters); functions[functionCount++] = function; } } fclose(sourceFile); // 输出提取到的函数信息 for (int i = 0; i < functionCount; i++) { printf("函数名:%s\n", functions[i].name); printf("返回类型:%s\n", functions[i].returnType); printf("参数列表:%s\n", functions[i].parameters); printf("\n"); } return 0; } ``` 需要注意的是,这只是一个简单的示例,提取函数的方法和规则可能因实际情况而有所不同。在实际使用时,你可能需要根据你的源代码的特点进行适当调整和修改。 ### 回答3: 您好!要编写一个提取C语言函数的程序,可以按照以下步骤进行: 1. 打开一个C语言源文件,并读取其中的内容。 2. 分析源文件的内容,需要寻找以"{"开始和以"}"结束的函数定义部分。 3. 判断函数定义部分的开始标记和结束标记的位置。可以使用字符串处理函数来查找这些标记。 4. 找到函数定义部分后,提取出函数的名称、返回类型和参数列表。 5. 将提取的函数信息输出,可以使用printf函数将结果打印到控制台或写入到文件中。 下面是一个简单的示例代码,以帮助您更好地理解: ```c #include <stdio.h> #include <string.h> void extractFunctions(char* filename) { FILE* file = fopen(filename, "r"); if (file == NULL) { printf("无法打开文件\n"); return; } char line[256]; while (fgets(line, sizeof(line), file)) { if (strstr(line, "{") != NULL && strstr(line, ")") != NULL) { // 找到函数定义部分的开始位置 char* start = strstr(line, "{"); char* end = strstr(line, ")"); // 提取函数名称 char functionName[100]; strncpy(functionName, line, end - line); functionName[end - line] = '\0'; // 提取返回类型和参数列表 char returnType[50]; char parameters[100]; sscanf(line, "%s %[^)]", returnType, parameters); printf("函数名称:%s\n", functionName); printf("返回类型:%s\n", returnType); printf("参数列表:%s\n", parameters); printf("=========================\n"); } } fclose(file); } int main() { char filename[] = "sample.c"; // 替换为你的C语言源文件路径 extractFunctions(filename); return 0; } ``` 请注意,这是一个简单的示例程序,仅提供了最基本的函数提取功能。实际使用中,您可能需要对代码做进一步优化,以适应更多的C语言源文件格式和函数定义方式。希望对您有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值