以下是问题代码。
#include <iostream>
#include <cctype>
using namespace std;
void convertToUppercase(char *);
int main()
{
char phrase[] = "characters and $32.98";
cout << "The phrase before conversion is : " << phrase;
convertToUppercase(phrase);
cout << "\nThe phrase after conversion is : " << phrase << endl;
return 0;
}
void convertToUppercase(char *sPtr)
{
while (*sPtr != "\0")
{
if (islower(*sPtr))
*sPtr = toupper(*sPtr);
cout << "sPtr (before) = " << sPtr;
sPtr++;
cout << "\nsPtr (after) = " << sPtr << endl;
}
}
输出窗口显示:
1>d:\sync files\converting lowercase letter to uppercase letters\converting lowercase letter to uppercase letters\main.cpp(19): error C2446: '!=' : no conversion from 'const char *' to 'int'
1> There is no context in which this conversion is possible
1>d:\sync files\converting lowercase letter to uppercase letters\converting lowercase letter to uppercase letters\main.cpp(19): error C2040: '!=' : 'int' differs in levels of indirection from 'const char [2]'
我犯的错误在哪里?我完全复制了我书中的代码,但问题仍然存在。
抱歉,我找不到。需要帮助。
感谢您的关注。
答案 0 :(得分:4)
很简单,你的比较是错误的。
while (*sPtr != "\0")
应该是
while (*sPtr != '\0')
答案 1 :(得分:3)
尝试
while (*sPtr != '\0')
您可能还会因修改字符串常量而获得seg错误
答案 2 :(得分:3)
while
循环的条件错误,您需要使用单引号编写while(*sPtr != '\0')
。
说明:'\0'
是单个字符,"\0"
是字符串常量,i。即在这种情况下,两个字符的数组。
还有更短的方法来编写循环条件:
您可以使用普通零而不是'\0'
:while(*sPtr != 0)
您甚至可以省略比较,因为您要比较为零:while(*sPtr)
答案 3 :(得分:3)
您正在尝试将char
与char const*
进行比较(嗯,真的是char const[2]
,但这只是一个细节)。你可能想要使用
while (*sPtr != '\0')
或
while (*sPtr)
请注意,您对islower()
和toupper()
的使用不能保证有效:这些函数的参数必须为正数,但char
可能具有负值。您需要先将char
转换为unsigned char
:
toupper(static_cast<unsigned char>(*sPtr))
不需要islower()
的测试:在非低char
s toupper()
上只返回参数。省略第一个就是提高绩效。
答案 4 :(得分:2)
您需要做的就是将while (*sPtr != "\0")
更改为while (*sPtr != '\0')
。您正在尝试将字符串与字符串进行比较。我同意@chris,但你不需要检查它是否是小写。这样做很麻烦,它不会减少算法的运行时间。
答案 5 :(得分:2)
*sPTR != '\0'
,"\0"
的类型为const char*
toupper
传递了否定值,则会调用UB,因此请务必使用static_cast<unsigned char>
(Details)islower
,toupper
已经这样做让您的生活更轻松,使用std::string
:
void convertToUpper (std::string& str) {
for (auto& v:str)
v = toupper(static_cast<unsigned char>(v));
}