我正在查看去年过去的家庭作业,我从来没有弄清楚为什么这可以用于检查数组中的每个字符串是否是回文(向后拼写的单词是同一个词 - 'racecar') :
for (int k = 0; k < numElems; k++){
pStatus = true;
lastLetter = (*ptrArray[k]).length() - 1;
for (int i = 0; i <= (lastLetter / 2); i++){
if (ptrArray[k][0][i] != ptrArray[k][0][lastLetter - i])
pStatus = false;
}
if (pStatus == true){
//...
}
}
如果我没记错的话,我通过反复试验编写了这段代码,当时两个维度会给我带来奇怪的结果。我只是搞乱了代码,并在对它无法工作感到沮丧之后尝试了一些奇怪的事情。
因此,要访问数组中每个字符串中的每个单独字符,我需要编写ptrArray[k][0][lastLetter - i]
而不是ptrArray[k][lastLetter - i]
。这是为什么?
编辑:
你们中的一些人想要更多的代码,我想我忽略了ptrArray是指向字符串指针的事实(我记得我们必须在这个赋值中使用指向数组的指针)。这就是我们需要引入[0]
的原因吗?这是函数的原型:
void checkIfPalindrome(string **ptrArray, int numElems);
我动态分配了指针数组。
string **ptrArray;
ptrArray = new string*[numElems];
答案 0 :(得分:1)
您的类型为string**
。 string
本身就是一个数组类型,所以我们实际上有一个三维数组。 ptrArray[k]
访问指向string
的指针,ptrArray[k][0]
访问string
(实际上相当于*(ptrArray[k])
),ptrArray[k][0][i]
访问i
地址ptrArray[k]
中指针指向的数组“first”字符串中的字符。
答案 1 :(得分:0)
我将对您的代码做一些假设,因为所使用的所有变量都不在范围内。让我们尝试用伪代码编写算法。
strings = [ "str1", "str2",... ]
for each s in strings:
is_palindrome = true
last_index = s.length - 1
for i in [0, last_index]:
if s.charAt(i) != s.charAt(last_index - i)
is_palindrome = false
if is_palindrome == true:
#...
您实际上只在算法中使用了两个维度,因为您始终可以访问第二个维度中的第0个元素。所以我们可以重写你的代码,如
std::vector<std::string> ptrArray = ...;
int numElems = ptrArray.length();
for (int k = 0; k < numElems; k++){
pStatus = true;
lastLetter = ptrArray[k].length() - 1;
for (int i = 0; i <= (lastLetter / 2); i++){
if (ptrArray[k][i] != ptrArray[k][lastLetter - i]) {
pStatus = false;
}
}
if (pStatus == true){
//...
}
}
其中ptrArray
是字符串数组ptrArray[i]
是第i个字符串,ptrArray[i][j]
是第i个字符串的第j个字符。