任务是创建一个函数,该函数将返回字符串的最后一个单词。例如,在字符串
中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;
}
我的问题是如何返回最后一个单词,而后面没有空格或其他符号?我在忽略最后一个字之后的所有内容时遇到了问题。
答案 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
,一个是输入字符串中的指针,另一个是该单词的字节数。