我的C ++程序有问题。我有一个带有函数bool的模板类,该函数检查给定的单词或数组是否是回文。对于int和char,everythig很好,并且程序生成“ yes”,但是对于字符串程序启动,但它给出了
PK4_5.exe中0x534408DA(msvcr120d.dll)的首次机会异常:
0xC0000005:访问冲突读取位置0x00000003。未处理
PK4_5.exe中的0x534408DA(msvcr120d.dll)异常:0xC0000005:
访问冲突读取位置0x00000003。
该代码有什么问题?
这是代码:
主功能:
#include "palindrom.h"
int main(){
int iTab[] = { 1, 2, 3, 2, 1 };
char cTab[] = "abcba";
string word ("aaaa");
palindrom<int> A;
palindrom<char> B;
palindrom<string> C;
if (A.palindrome(iTab, 5))
cout << "yes";
if (B.palindrome(cTab, strlen(cTab)))
cout << "yes";
if (C.palindrome(&word, word.length()))
cout << "yes";
return 0;
}
palindrom.h:
#pragma once
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class palindrom
{
public:
bool palindrome(const T*x, int length);
palindrom();
~palindrom();
};
template <typename T>
bool palindrom<T>::palindrome(const T* x, int length){
for (int i = length / 2 - 1; i >= 0; i--)
if (x[i] != x[length - i - 1])
return false;
return true;
}
template <typename T>
palindrom<T>::palindrom(){}
template <typename T>
palindrom<T>::~palindrom(){}
palindrom.cpp为空。
最佳答案
问题是您将要创建回文的集合作为指针传递。这意味着,从std::string
中将其视为字符串数组,因此执行x[0]
以外的任何操作都将导致未定义的行为。
而是将其作为非指针传递,并在需要时使用指针模板类型创建palindrom
:
palindrom<int*> A;
palindrom<char*> B;
palindrom<string> C;
这样,你可以
bool palindrome(const T& x, int length);
它也适用于
std::string
。