返回字符串的最后一个单词-C编程

时间:2018-08-18 11:01:23

标签: c string pointers

任务是创建一个函数,该函数将返回字符串的最后一个单词。例如,在字符串

Danas je divan dan!

该函数应返回dan,而不返回!。 另一个例子是

Danas  je divan   dan   

该函数应再次返回dan,但必须忽略该单词后的所有空格。

这是到目前为止我想出的内容:

#include <stdio.h>

char *PosljednjaRijec(char *s) {
    char *p = s;
    while (*p != '\0')
        p++;
    while (*p != ' ')
        p--;
    p++;

    return p;
}

int main() {
    printf("Posljednja rijec: %s", PosljednjaRijec("Danas je divan dan!\n"));
    printf("Posljednja rijec: %s", PosljednjaRijec("  Danas  je divan   dan   "));
    return 0;
}

我的问题是如何返回最后一个单词,而后面没有空格或其他符号?我在忽略最后一个字之后的所有内容时遇到了问题。

3 个答案:

答案 0 :(得分:3)

如果允许您修改数组,只需在找到的最后一个单词之后设置一个'\0'终止符即可。如果没有,则需要分配内存并返回最后一个单词的副本,以便稍后使用free()释放。

请注意,在您的main函数中,您将字符串常量传递给PosljednjaRijec函数,因此它不应修改其参数指向的数组,将其声明为const char *s即可这个更加明确。因此,只有第二个选项是安全的,并且由于您不释放返回值,因此会发生内存泄漏。

还请注意,如果参数数组不包含任何空格,则当前的实现具有未定义的行为。

这是一个解决方案:

#include <stdio.h>
#include <string.h>

char *PosljednjaRijec(const char *s) {
    int i, j = strlen(s);
    while (j > 0 && s[j - 1] == ' ')
        j--;
    for (i = j; i > 0 && s[i - 1] != ' '; i--)
        continue;
    char *p = malloc(j - i + 1);
    if (p) {
        memcpy(p, s + i, j - i);
        p[j - i] = '\0';
    }
    return p;
}

编辑:根据您的额外要求,您可以修改函数以返回指向最后一个单词的第一个字符的指针,并返回一个int来说明该字符的数量。遗言。您可能想跳过所有空格字符,这很容易通过isspace()中定义的<ctype.h>来完成:

#include <ctype.h>
#include <stdio.h>
#include <string.h>

char *PosljednjaRijec(const char *s, int *plen) {
    int i, j = strlen(s);
    while (j > 0 && isspace((unsigned char)s[j - 1]))
        j--;
    for (i = j; i > 0 && !isspace((unsigned char)s[i - 1]); i--)
        continue;
    *plen = j - i;
    return (char *)(s + i);
}

int main() {
    int len;
    char *p;
    p = PosljednjaRijec("Danas je divan dan!\n", &len);
    printf("Posljednja rijec: '%.*s'\n", len, p);
    p = PosljednjaRijec("  Danas  je divan   dan   ", &len);
    printf("Posljednja rijec: '%.*s'\n", len, p);
    return 0;
}

输出:

Posljednja rijec: 'dan!'
Posljednja rijec: 'dan'

答案 1 :(得分:0)

比较您在ASII中找到的最后一个单词的最后一个字符x,如果不是来自“ a” <= x <=“ z”和“ A” <= x <=“ Z”,则“删除”用你的方式

答案 2 :(得分:0)

  

我的问题是如何返回最后一个单词

了解有关character classification functions in <ctype.h>的信息。您可能要使用isalpha。但是,UTF8 is everywhere可能会更复杂(考虑使用libunistring

您可以返回一个新的heap-allocated字符串(使用calloc进行分配,然后适当地填充它,但为终止的 NUL 字节留出空间;或使用{{ 3}}或asprintf(如果允许使用),并记录约定以后应free-d(通常由调用者或更高版本)使用。或者,您可以返回两个成员的struct,一个是输入字符串中的指针,另一个是该单词的字节数。