字符串最后一个单词的长度

描述
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。

输入描述:
输入一行,代表要计算的字符串,非空,长度小于5000。

输出描述:
输出一个整数,表示输入字符串最后一个单词的长度。

首先,我们看下问题描述,计算最后一个单词的长度,那么我们脑海里面涌现的想法是:

  1. 这行字符串一定是通过某种方式隔开了每个单词,而我们最常见的隔开方式就是空格;
  2. 有了前面的认知,那我们就能够知道准确的找到最后一个单词;
  3. 通过什么方法能够准确的找到最后一个空格?

我们首当其冲想到的方法可能就是遍历一个数组,并且这个数组正着遍历可能会有一些麻烦,只能倒着遍历。

其次,看到字符串,我们是不是可以想一想其他的方法,比如说用一下std::string类呢?

下面我们针对这两种情况分别来看看实现和运行情况:

1、倒着遍历字符串的方法

#include <iostream>
#include <string.h>
int main(int argc, char* argv[])
{
    char data[5000] = {0};
    char* pData = data;
    
    fgets(data, sizeof(data), stdin);
    
    int len = strlen(data) - 1;
    if(len <= 0)
    {
        std::cout << 0 << std::endl;
        return 0;
    }
    
    pData = pData + len - 1;
    int count = 0;
    for(int nIndex = 0; nIndex < len; ++nIndex)
    {
        if(*pData != ' ')
        {
            ++count;
            --pData;
            continue;
        }
        break;
    }
    
    std::cout << count << std::endl;
    return 0;
}

上面的代码相对来说还是比较简单的,从字符串的尾部进行单字符的遍历,如果字符不为空格,则计数加 1,直到遇到空格或者遍历结束(因为可能输入的就是一个单纯的单词),跳出循环。

看下它的运行效果:
在这里插入图片描述
运行时间3ms,占用内存:376KB

2、借用std::string类

std::string其实在我们的日常工作中经常会用到,在C++11中,它是一个标准的模板类,有自己的成员函数和算法。那么怎么巧妙的借用std::string类,能够实现上面的要求呢?

首先我们想到的还是遍历,倒着遍历,因此会有下面的实现:

#include <iostream>
#include <string>

int main(int argc, char* argv[])
{
    std::string s;
    getline(std::cin, s, '\n');
    int count = 0;
    for(auto itor = s.rbegin(); itor != s.rend(); ++itor)
    {
        if(*itor == ' ')
        {
            break;
        }
        ++count;
    }
    std::cout << count << std::endl;

    return 0;
}

如上:我们借用了std::string模版类的倒序迭代器进行了遍历。运行结果如下:

在这里插入图片描述
在测试的过程中,有一个发现,就是如果,将 std域,通过在 main函数之前申明,using namespace std;,和上面的运行结果是有一点差别的。
在这里插入图片描述

上面的代码运行结束之后,突然有一种想法浮现,我们是不是可以通过借助string 类成员函数,使得整行字符串的长度 - 在这个字符串里面找到的最后一个空格的位置。这样的结果不就是剩下的最后一个单词再加最后一个空格的长度了吗?

于是,有了下面的验证:

#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
    string s;
    getline(cin, s, '\n');
    int count = s.length() -(s.rfind(' ') + 1);
    cout << count << endl;
    return 0;
}

运行结果:
在这里插入图片描述

有一点需要说明的是,上面的运行结果都是在自测运行的模式下得到的结果,如果在牛客网点击保存提交的结果则如下,下面的顺序分别对应上面的顺序。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过上面的结果我们也能够看出,最后一种方法是运行结果相对比较好的。模板库和它自己的成员函数会是一个不错的选择。

### 回答1: 下面是一个用 C 语言实现的函数,其可以将文件每一行中第一个空格前的字符串加入到一个字符串数组里: ```c #include <stdio.h> #include <string.h> #define MAX_LINES 1000 #define MAX_LENGTH 100 void get_lines(char *lines[], int max_lines, char *line_storage); char *alloc(int n); int main() { char *lines[MAX_LINES]; char line_storage[MAX_LINES * MAX_LENGTH]; int num_lines = 0; get_lines(lines, MAX_LINES, line_storage); for (int i = 0; i < num_lines; i++) { printf("%s\n", lines[i]); } return 0; } void get_lines(char *lines[], int max_lines, char *line_storage) { char *line, *p; int c, len; int line_count = 0; line = alloc(MAX_LENGTH); p = line; while ((c = getchar()) != EOF) { if (c == '\n') { *p++ = '\0'; len = p - line; lines[line_count++] = strncpy(line_storage, line, len); line_storage += len; p = line; if (line_count >= max_lines) { break; } } else if (c == ' ') { *p++ = '\0'; len = p - line; lines[line_count++] = strncpy(line_storage, line, len); line_storage += len; p = line; } else { *p++ = c; } } if (line_count > 0) { *p++ = '\0'; len = p - line; lines[line_count++] = strncpy(line_storage, line, len); } *p = '\0'; } char *alloc(int n) { static char buf[10000]; static char *bufp = buf; if (buf + 10000 - bufp >= n) { bufp += n; return bufp - n; } else { return 0; } } ``` 该函数使用 `getchar()` 函数从标准输入读取字符,并使用 `alloc()` 函数动态地分配内存,以便存储每个字符串。在读取每个字符串时,函数会遇到空格或新行符。如果遇到空格符,该函数会将当前字符串添加到字符串数组中,并将指针移动到下一个位置。如果遇到新行符,函数会将当前字符串添加到字符串数组中,并将指针移动到下一个位置。如果字符串数组的容量达到最大值,则该函数将停止读取字符。最后,该函数将字符串数组的指针返回给主函数,以便打印它们。 ### 回答2: C语言实现函数将文件每一行的空格前的字符串加入到一个字符串数组里,可以按照以下步骤进行实现: 1. 创建一个函数,命名为`getStringsFromFile`,该函数接受两个参数:文件名(包括路径)和字符串数组。 2. 在`getStringsFromFile`函数中,首先打开文件,可以使用`FILE*`类型的指针来表示文件。打开文件可以使用`fopen`函数,将文件名作为参数传入,同时需要检查文件是否成功打开。 3. 创建一个字符串变量,用来存储文件的每一行内容。可以使用`char`类型的数组,长度根据文件每行的最大长度来确定。 4. 创建一个循环,在循环中,使用`fgets`函数读取文件的每一行内容,并将其存储到刚才创建的字符串变量中,同时需要检查文件是否已经到达末尾。 5. 在循环中,使用`strtok`函数按照空格分隔字符串为若干个子串,并将每个子串存储到字符串数组中。可以使用`strtok(NULL, " ")`来遍历每个子串。 6. 在循环中,通过`strcpy`函数将每个子串复制到字符串数组中的一个元素里。为了保证每个元素的空间足够,可以提前创建字符串数组时就根据文件行数和每行字符串的最大长度来确定。 7. 在循环结束后,通过`fclose`函数关闭文件。 8. 返回从文件中提取的字符串数量,以便外部程序可以使用。可以使用指针对数组进行操作,将字符串数量作为其中一个元素返回。 以上给出了一种实现思路,根据具体的需和文件的结构可能需要做一些修改。 ### 回答3: 可以通过以下的C语言代码实现将文件每一行的空格前的字符串加入到一个字符串数组中: ```C #include <stdio.h> #include <stdlib.h> #include <string.h> void extractString(char *line, char **strArray, int *count) { char *token; token = strtok(line, " "); // 按空格分割字符串,获取第一个单词 while (token != NULL) { strArray[*count] = malloc(strlen(token) + 1); // 分配内存给字符串数组里的元素 strcpy(strArray[*count], token); // 将单词复制到数组元素中 (*count)++; // 元素个数加1 token = strtok(NULL, " "); // 继续获取下一个单词 } } int main() { char fileName[] = "test.txt"; // 文件名 FILE *file = fopen(fileName, "r"); // 打开文件 if (file == NULL) { printf("无法打开文件:%s\n", fileName); return 1; } char line[256]; char *strArray[100]; // 存储字符串的数组 int count = 0; // 数组中元素的个数 while (fgets(line, sizeof(line), file)) { // 逐行读取文件内容 extractString(line, strArray, &count); // 提取行中的字符串 } fclose(file); // 关闭文件 // 打印存储的字符串 for (int i = 0; i < count; i++) { printf("%s\n", strArray[i]); } // 释放内存 for (int i = 0; i < count; i++) { free(strArray[i]); } return 0; } ``` 该程序中,我们首先定义了一个函数`extractString`来提取每一行中的字符串。这个函数使用`strtok`函数将一行根据空格进行分割,获取到分割后的每个字符串,并逐一将其存入字符串数组中。 在主函数中,我们首先打开文件,然后逐行读取文件内容。对每一行,调用`extractString`函数提取其中的字符串,并将其存入字符串数组中。 最后,我们打印出存储的字符串,并释放申请的内存。 请注意,以上代码中的文件名为"test.txt",需要根据实际情况修改。同时,为了简化示例代码,假设字符串数组的最大长度为100,可以根据需要进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值