C++ Template:
class MyClass
{
public:
getNiCount(...)
{
}
replaceNiWithNI(...)
{
}
};
int main()
{
const char *szTestString1 = "Ni nI NI nI Ni";
const wchar_t *szTestString2 = L"Ni nI NI nI Ni";
// Invoke getNiCount(...) of class MyClass
// Invoke replaceNiWithNI(...) of class MyClass
// Display on screen: "Found X occurrences of Ni. New string: Y"
}
任务说明:
getNiCount
的两个函数replaceNiWithNI
和MyClass
:
getNiCount
应该返回szTestString1/2
内的“Ni”的出现次数(区分大小写)replaceNiWithNI
应将szTestString1/2
中出现的所有“Ni”替换为“NI”(区分大小写)getNiCount
和replaceNiWithNI
。X
和Y
应替换为真实值。MyClass
应该能够处理szTestString1
(ASCII)和szTestString2
(Unicode)。一般要求:
代码应为
您可以使用基于C ++语言的所有技术,工具包和框架。
我的解决方案(不完整)
逻辑如下...... 但是在我的系统中,function2“replace”崩溃了。无法修复它。
#include<iostream>
#include<string>
using namespace std;
class MyClass
{
public:
void getNiCount(const char*,const wchar_t*);
//cout<<"\nCount is :"<<count;
void replaceNiWithNI(const char*,const wchar_t*);
};
void MyClass::getNiCount(const char* x,const wchar_t* y)
{
int count=0;
int ycount=0;
for(int i=0; x[i]!='\0';i++)
{
if(x[i]=='N')
{ if(x[i+1]=='i')
count++;
}
}
for(int i=0; y[i]!='\0';i++)
{
if(y[i]=='N')
{ if(y[i+1]=='i')
ycount++;
}
}
cout<<"\nFound "<<count<<" occurences of Ni in String 1";
cout<<"\nFound "<<ycount<<" occurences of Ni in String 2";
}
void MyClass:: replaceNiWithNI(const char* x,const wchar_t* y)
{ char* a;
wchar_t* b;
strcpy(a,x);
for (int i=0;a[i]!='\0';i++)
{
if (a[i]=='N')
{ if(a[i+1]=='i')
{
a[i+1]='I';
}
}
}
for (int i=0;y[i]!='\0';i++)
{
b[i]=y[i];
}
for (int i=0;b[i]!='\0';i++)
{
if (b[i]=='N')
{ if(b[i+1]=='i')
{
b[i+1]='I';
}
}
}
cout<<"\nNew String 1 is :";
puts(a);
cout<<"\nNew String 2 is :";<<b
}
int main()
{
const char *szTestString1 = "Ni nI NI nI Ni";
const wchar_t *szTestString2 = L"Ni nI NI nI Ni";
MyClass ob1;
ob1.getNiCount(szTestString1,szTestString2);
ob1.replaceNiWithNI(szTestString1,szTestString2);
getchar();
return 0;
}
答案 0 :(得分:4)
这里有一些问题:
由于
中的错误分号,您的程序无法编译cout<<"\nNew String 2 is :";<<b
您的程序在strcpy(a,x);
崩溃,因为您正在复制到未初始化的a
- 它没有分配内存。您需要在new
上调用a
才能使其正常工作,这也意味着您需要知道所需数组的大小(可能是该函数的另一个参数)。
使用std::string
和std::wstring
几乎总是优于处理原始字符数组。例如,请参阅this question。我知道你可能已经考虑过了,因为你有#include <string>
由于您需要对不同类型执行相同的操作,我怀疑练习的重点可能是使用模板。
你说
getNiCount
应该返回出现次数......
但是你的getNiCount
没有返回任何内容。
using namespace std;
通常为considered bad practice。
通常值favouring pre-increments rather than post-increments,尽管在这种特殊情况下,没有开销。
为您举例说明上述建议:
#include <iostream>
#include <string>
template<typename StrType>
class MyClass {
public:
int getNiCount(const StrType& input) const;
void replaceNiWithNI(StrType& input) const;
};
template<typename StrType>
int MyClass<StrType>::getNiCount(const StrType& input) const {
int count = 0;
for (int i = 0; i < input.size() - 1; ++i) {
if (input[i] == 'N' && input[i + 1] == 'i')
++count;
}
return count;
}
template<typename StrType>
void MyClass<StrType>::replaceNiWithNI(StrType& input) const {
for (int i = 0; i < input.size() - 1; ++i) {
if (input[i] == 'N' && input[i + 1] == 'i')
input[i + 1] = 'I';
}
}
int main() {
const char* szTestString1 = "Ni nI NI nI Ni";
MyClass<std::string> ob1;
std::string testString1(szTestString1);
int count1 = ob1.getNiCount(testString1);
ob1.replaceNiWithNI(testString1);
std::cout << "Found " << count1 << " occurences of Ni in String 1. "
<< "New string: " << testString1 << '\n';
const wchar_t* szTestString2 = L"Ni nI NI nI Ni";
MyClass<std::wstring> ob2;
std::wstring testString2(szTestString2);
int count2 = ob2.getNiCount(testString2);
ob2.replaceNiWithNI(testString2);
std::wcout << L"Found " << count2 << L" occurences of Ni in String 2. "
<< L"New string: " << testString2 << '\n';
getchar();
return 0;
}
我通常会离开您找到的方式并替换Ni
字符。 member functions of std::string
和<algorithm>
library中提供了更复杂的选项。