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

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

http://www.nowcoder.com/questionTerminal/8c949ea5f36f422594b306a2300315da

C语言解题

思路:

  1. 使用strrchr找到最右边的第一个空格,然后将指针移动到首字母。

注意:

  1. 获取输入时,尽量不要使用gets,有溢出风险,建议使用fgets(char *s, int n, FILE *stream);
  2. 使用fgets时,如果字符串长度小于n-1且结尾有换行符,则会获取换行符,并在换行符之后填充'\0',所以计算长度时需要判断是否需要减去换行符
#include <stdio.h> //printf, fgets, stdin
#include <string.h> //strrchr, strchr, strlen

int main(void)
{
    char str[5000] = {0};
    int length = 0;
    char *p = NULL;

    /* 使用fgets从标准输入(stdin)获取一行 */
    fgets(str, sizeof(str), stdin);

    /* 使用strrchr找到最右边的第一个空格 */
    p = strrchr(str, ' ');
    if (p)
        p = p + 1; //指向首字母
    else
        p = str; //只有一个单词

    /* 使用strchr查找是否存在换行符 */
    if (strchr(p, '\n'))
        length = strlen(p) - 1;
    else
        length = strlen(p);

    printf("%d\n", length);
    return 0;
}
全部评论
直接用gets函数不行吗??
2 回复 分享
发布于 2020-05-12 12:59
这中写法无法兼顾碰到非英文字母字符串的问题,例如 “9999 ppp 00 ”这种情况下输出的应该是3而不是2
10 回复 分享
发布于 2021-04-22 22:46
strlen计算字符串有效长度,不包含换行符
8 回复 分享
发布于 2020-02-27 20:01
这个范例,无法兼顾,输入的字符串的末尾以1个或者多个空格结尾的情况,只要末尾有个空格,这个范例就输出0,明显有缺陷
6 回复 分享
发布于 2021-04-23 23:14
#include <stdio.h> #include <string.h> int main(void) { char str[100]; while (scanf("%s", &str)==EOF) {break;} int a=strlen(str); int i; for(i=strlen(str);i>0;i--) {if(str[i]==' ') i=strlen(str)-i; break;} printf("%d", i); return 0; }</string.h></stdio.h>
2 回复 分享
发布于 2021-06-27 13:48
为什么在VC++6.0中编译不通过呢?
2 回复 分享
发布于 2022-02-23 19:43
i是递增,str_p递减,为啥不直接从最后一个字符往前读
2 回复 分享
发布于 2022-03-16 12:47
strlen()函数求出的字符串长度为有效长度,不包含字符串末尾结束符 ‘\0’,不需要-1
1 回复 分享
发布于 2021-08-04 20:06
异常处理和复杂字符输入也需要考虑一下吧
点赞 回复 分享
发布于 2021-08-04 20:09
这种解法有没有考虑4999个字符的极限输入情况,读入5000-1个字符,然后加一个空字符,此时strlen得出的结果是不是4999,这时候减去1会不会有问题,求解答
点赞 回复 分享
发布于 2021-10-09 11:04
如果只有一个单词不行吧 前面没空格
点赞 回复 分享
发布于 2021-12-28 22:44
您的代码主要目的是从用户输入的一行文本中找出最后一个空格后面的字符串(包括空格后无其他字符即整行文本的情况),并计算这部分字符串的长度(不包括末尾的换行符,如果存在的话)。代码基本正确,但有几个地方可以优化或明确其意图: 注释和变量命名:注释和变量命名已经相对清晰,但可以在p = p + 1;后添加注释说明p现在指向第一个字符。 换行符处理:在处理换行符时,您已经正确地检查了换行符的存在并相应地减少了长度。这是正确的做法,因为fgets会将换行符(如果有的话)存储在字符串中。 边界情况处理:当输入为空行时,strrchr将返回NULL,此时p已经是str,即指向字符串的开始。您已经处理了这种情况,很好。 代码整洁性:可以稍微调整代码结构,使其更加紧凑和易于理解。 以下是优化后的代码示例: c #include <stdio.h> #include <string.h> int main(void) { char str[5000] = {0}; int length = 0; char *p = NULL; // 使用fgets从标准输入(stdin)获取一行 fgets(str, sizeof(str), stdin); // 使用strrchr找到最右边的第一个空格 p = strrchr(str, ' '); if (p) { // 如果有空格,则p指向空格后的第一个字符 p++; } else { // 如果没有空格,则整个字符串作为目标 p = str; } // 使用strchr查找是否存在换行符 if (strchr(p, '\n')) { // 如果存在换行符,则计算长度时不包括它 length = strlen(p) - 1; } else { // 如果没有换行符或字符串以换行符结束但p在换行符之前,则直接使用strlen length = strlen(p); } // 输出结果 printf("%d\n", length); return 0; } 这个版本的代码与原始版本在功能上相同,但通过对变量p的更新和注释的添加,使得代码更加易于理解和维护。同时,它保持了原始代码的效率和正确性。</string.h></stdio.h>
点赞 回复 分享
发布于 08-12 00:41 广东

相关推荐

头像
11-21 11:39
四川大学 Java
是红鸢啊:忘了还没结束,还有字节的5k 违约金
点赞 评论 收藏
分享
牛客868257804号:九个中铁八个中建
点赞 评论 收藏
分享
172 45 评论
分享
牛客网
牛客企业服务