帮助理解 C++ 中的常量字符* 运算符

Help understanding const char* operators in c++

本文关键字:常量 字符 运算符 助理 C++ 帮助      更新时间:2023-10-16

我需要将一些代码从 c++ 转换为 java,但我不太确定如何处理"const char*"运算符。检查下面的代码:

const char* handText;
const char* index = strchr(handText, '-');
char handCeil[4];
char handFloor[4];
strncpy(handCeil, handText, index - handText);
strcpy(handFloor, index + 1);

我得到的是这样的:

String handText;
String index = handText.substring(handText.indexOf('-'));
char handCeil[4];
char handFloor[4];

但是,我不知道在 c++ 中添加整数(索引 + 1)或减去(索引 - handText)字符串时是什么意思。对不起,如果这是一个愚蠢的问题,但我从未学过如何用 c++ 编程,只学过 java。谢谢。

strncpy(handCeil, handText, index - handText);
strcpy(handFloor, index + 1);

相当于

int index = handText.indexOf('-'); // I changed this for you
handCeil = handText.substring(0, index+1);
handFloor = handText.substring(index+1);

因此,它通过"-"拆分字符串,并将第一部分(我认为包括"-"本身)放入handCeil,其余部分放入handFloor

index - handText的意思是:index指向特定字符,handText指向该字符串的开头。如果减去这两个指针,则得到这两个指针之间的字符数,或第一个"-"的数组索引。 strncpy复制n字节,因此如果index指向第 3 个字符,它将复制 3 个字符。 index + 1 表示在 index 指向的字符 1 之后指向字符 1。

你不能在 Java 中使用指针。您可以使用String方法(如 subString(int startIdx, int endIdx))提取子字符串以分配给 handCeil 和 handFloor。我宁愿将它们保留为 Java String。如果以后您需要访问单个字符,您可以通过charAt(int idx)方法进行操作。

将 1 添加到字符*(指针)会使指针增加一个字符。

因此,在提供的代码中,由于索引指向 handText 中的"-",因此递增它将导致指针现在指向下一个字符。

(顺便说一句,提供的C++代码根本不安全,并且会导致许多可能的 handText 值出现重大错误,例如"这是一个字符串-;)"。

代码段调用未定义的行为

const char* handText;
const char* index = strchr(handText, '-');

handText 是一个未初始化的指针常量。将其作为参数传递给strchr调用 UB。 strchr返回指向handText中第一次出现的-的指针,但handText没有指向任何位置或垃圾。