我正在尝试从链接列表中删除节点。节点具有用户输入的名称。但我无法弄清楚如何忽略while循环中的大写/小写。这是我的代码。
void del(string e)
{
temp=new node;
temp=head;
temp2=new node;
temp2=temp->next;
if(temp->info==e)
{
head=temp->next;
delete temp;
}
else
{
while(temp2->info!=e)
{
temp=temp->next;
temp2=temp2->next;
}
temp2=temp2->next;
temp->next=temp2;
}
}
我得到了这个
的字符串cout<<"Enter the name to delete"<<endl;
ws(cin);
getline(cin,e);
del(e);
那么有没有办法忽略while循环和if语句中的大写/小写?
答案 0 :(得分:0)
对两个字符串进行非案例敏感比较的技巧是将它们转换为低位或大写然后进行比较。
不幸的是,stl没有为案例转换提供非常方便的方法。所以,这里有一些可能性:Eclipse Marketplace, the update site URL for Aptana Studio 3。只是从那里复制:
#include <algorithm>
#include <string>
std::string data = "Abc";
std::transform(data.begin(), data.end(), data.begin(), ::tolower);
所以,在你的情况下,
string lowerE = std::transform(e.begin(), e.end(), e.begin(), ::tolower);
...
while(std::transform(temp2->info.begin(), temp2->info.end(), temp2->info.begin(), ::tolower) != lowerE) ...
当然,您可以创建一个函数来简化它或使用不同的转换方法。
另一种可能性就是使用tolower
或towlower
函数创建自己的比较函数并使用char比较char。
答案 1 :(得分:0)
您无需手动转换正在转换的字符串的大小写。如果您正在处理字符串,请使用strcmp。对于不区分大小写的检查,您可以使用_strcmpi。
E.g。
if(!strcmp(String1, String2)) { .... }
如果strcmp返回0(FALSE),那么就会出现匹配,并应用区分大小写。
对于没有区分大小写的比较,使用_strcmpi。
E.g。
#include <Windows.h>
#include <iostream>
using namespace std;
BOOL StringMatch(
CONST CHAR *CmpString,
CONST CHAR *CmpString2
)
{
return (!_strcmpi(CmpString,
CmpString2)) ? TRUE : FALSE;
}
int main()
{
if (StringMatch("hello", "HELLO"))
{
cout << "Match without case sensitivity\n";
}
getchar();
return 0;
}
由于您使用的是std :: string,因此可以使用.c_str()。
E.g。
string hellostring = "hello";
if (StringMatch(hellostring.c_str(), "HELLO"))
{
cout << "Match without case sensitivity\n";
}
如果你需要切换到Unicode编码而不是Ascii,你有wcscmp和_wcs * / wcs *。