如果 c == '\0',函数 Strrchr 如何找到最后一个 c?



例如,给定指向CCD_ 2中第一个字符的CCD_,Strrchr()如何找到最后一次出现的空字符?

出现以下问题:
=>停止循环取决于什么条件!
=>我认为在所有情况下,它都会尝试访问下一个内存区域以检查其状况?在某个点绕过字符串边界,UB!安全吗!

如果我错了,请随时纠正我!

正如注释中所解释的,这非常简单。第一个是C字符串中的最后一个也是唯一一个。

所以如果你写

char *str = "there is so many  \0 in this string !";
char *p = strrchr(str, 's');
printf("%sn", p);

它将打印

so 

因为CCD_ 5将在"s"中找到"s";因此";,这是你给它的字符串中的最后一个。(为了回答你的特定问题(如果你写

p = strrchr(str, '');
printf("%d %sn", (int)(p - str), p+1);

它将打印

12 ma

证明CCD_ 6发现了第一个CCD_。

很明显,str是一个长字符串,其中嵌入了一些;其中嵌入char *p0的字符串";。根据定义,C字符串不可能包含嵌入的。根据定义,第一个结束字符串。


再来一点。你曾提到,如果你要";访问下一个存储区域";,你会";在某个点绕过字符串边界,UB"你是对的。在我的回答中,当我说时,我避开了危险

p = strrchr(str, '');
printf("%d %sn", (int)(p - str), p+1);

这里,p指向strrchr认为的字符串末尾,所以当我计算p+1并尝试使用%s打印它时,如果我们不更清楚的话,看起来我确实误入了Undefined Behavior。在这种情况下,它当然是安全的,因为我们确切地知道第一个之外的内容。但如果我要写

char *str2 = "hello";
p = strrchr(str2, '');
printf("%sn", p+1);         /* WRONG */

那么我肯定会很紧张。

;字符串"一个字符阵列";以及";char*指针";。

  • C字符串是以空字符结尾的多个字符
  • 字符数组是定义的字符数
  • 从技术上讲,char*指针是指向单个字符的指针,但通常用于标记C风格字符串中的一个点

你说你有一个指向字符(char*p(的指针,而*p的值是"there is so many \0 in this string !"0,但你相信*p是C风格字符串的第一个字符"there is so many \0 in this string !"

正如其他人所说,因为你说这是一个C风格的字符串,但你不知道它的长度,所以p之后的第一个null将标记字符串的末尾。

如果这是一个字符数组char str[40],那么你可以通过从数组的末尾到开头for (i=39; i>=0; i--)循环来找到最后一个null,但你不知道它的长度,所以这不起作用。

希望这能有所帮助,如果我误入C++,请原谅我,我已经25年没有学习过C了:(

在您演示的情况下,您永远无法知道您找到的空字符是否是最后一个,因为您无法保证字符串的末尾。由于它是一个c字符串,因此可以保证该字符串以"\0"结尾,但如果你决定超越这个范围,你就不知道你访问的内存是否是你的。从数组中访问内存有未定义的行为,因为你可以只访问内存中属于你的下一个对象,也可以触摸未分配的内存,但它的块仍然属于你的进程,或者你可以尝试触摸根本不是你的段。只有第三个会导致SIGSEGV。你可以看到这个问题来检查分段错误,而不会破坏你的程序,但你的字符串可能在你捕捉到它之前就已经结束了。

字符串具有结束字符是有原因的。如果您坚持在字符串中的多个位置有\0,您可以用另一个字符终止,但请注意,所有库函数仍然会将第一个\0视为字符串的末尾。

在字符串中有多个\0被认为是一种糟糕的做法,也是一件非常糟糕的事情,所以如果可以的话,请避免它。

相关内容

  • 没有找到相关文章

最新更新