我想在不使用任何函数的情况下找到字符串的最后一个元素。
我的代码似乎可以正常工作,但是我不确定为什么它会以这种方式工作,并且会为输入感到高兴。
这是代码。
#include <stdio.h>
char *find_last(char *s);
int main(void)
{
char string[] = {"This is an Example"};
find_last(string);
return 0;
}
char *find_last(char *s)
{
/* char last;*/
while (*s++ != 0) {}
printf("*s ist %c", *(s-2));
return 0;
}
我不明白为什么我必须打印*(s-2)而不是*(s-1)才能获得最后一个字符。 (为了获得更多的字符,我只需要再减小一个,即*(s-3))。
哦,此外,看来* s的内容似乎是字母O(直到现在为止,我对它的理解是零),与所测试的示例字符串无关。这是为什么?我以为应该是零(0),因为我会增加指针直到它达到二进制零。
感谢您的帮助!
答案 0 :(得分:1)
由于++
是后递增运算符,因此在while
循环中会发生以下情况:
*s
与0
进行比较。s
递增。当s
到达字符串的末尾时,它指向空字符。将其递增以指向null后的 字符,然后退出循环。那时:
*s
=空字符后的字符,在您的情况下恰好是字母O
。
*(s-1)
=空字符。
*(s-2)
=字符串中的最后一个字符。
答案 1 :(得分:0)
稍后,asked关于处理涉及""
的极端情况。
首先建议阐明目标“找到字符串的最后一个元素”。根据定义:在C中,
一个 string 是一个连续的字符序列,以第一个空字符终止,包括第一个空字符。 C11§7.1.11
由于字符串包含一个空字符并且是最后一个字符,因此“查找字符串的最后一个字符”总是 < em>空字符。
某些OP对空字符之前的最后一个字符感兴趣。由于此类函数可能会收到有效的 string ""
并且无法找到此类字符,因此find_last()
可能会以某种方式出错,或者可能返回错误条件,例如NULL
,然后由呼叫者决定。
从类似于OP的代码开始
char *find_last(char *s) {
printf("Last character before the null character in \"*s\"", s);
if (*s == '\0') {
printf(" does not exist.\n");
return NULL;
}
while (*s) {
s++;
}
s--;
printf(" is '%c'\n", *s);
return s;
}