这个问题在这里已有答案:
我试图从链表中删除一个节点。节点具有用户输入的名称。但我无法弄清楚如何忽略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语句中的大写/小写?
两个字符串的非案例敏感比较的技巧是将它们转换为较低或大写然后进行比较。
不幸的是,stl没有为案例转换提供非常方便的方法。所以,这里有一些可能性:https://stackoverflow.com/a/313990/1143850。只是从那里复制:
#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。
您不需要手动转换正在转换的字符串的大小写。如果你正在处理字符串,请使用strcmp。对于不区分大小写的检查,您可以使用_strcmpi。
EG
if(!strcmp(String1, String2)) { .... }
如果strcmp返回0(FALSE),则表示匹配,并应用了区分大小写。
对于没有区分大小写的比较,使用_strcmpi。
EG
#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()。
EG
string hellostring = "hello";
if (StringMatch(hellostring.c_str(), "HELLO"))
{
cout << "Match without case sensitivity\n";
}
如果你需要切换到Unicode编码而不是Ascii,你有wcscmp和_wcs * / wcs *。