查找没有C语言中函数的字符串的最后一个字符

时间:2018-12-31 16:30:03

标签: c arrays string pointers


我想在不使用任何函数的情况下找到字符串的最后一个元素。
我的代码似乎可以正常工作,但是我不确定为什么它会以这种方式工作,并且会为输入感到高兴。
这是代码。

#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),因为我会增加指针直到它达到二进制零。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

由于++是后递增运算符,因此在while循环中会发生以下情况:

  1. *s0进行比较。
  2. s递增。
  3. 如果比较成功,则循环退出。

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;
}