没有从“const char”转换为“int”

时间:2013-11-30 17:07:50

标签: c++ pointers

以下是问题代码。

#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]'

我犯的错误在哪里?我完全复制了我书中的代码,但问题仍然存在。

抱歉,我找不到。需要帮助。

感谢您的关注。

6 个答案:

答案 0 :(得分:4)

很简单,你的比较是错误的。

while (*sPtr != "\0")

应该是

while (*sPtr != '\0')

答案 1 :(得分:3)

尝试

while (*sPtr != '\0')

您可能还会因修改字符串常量而获得seg错误

答案 2 :(得分:3)

while循环的条件错误,您需要使用单引号编写while(*sPtr != '\0')

说明:'\0'是单个字符,"\0"是字符串常量,i。即在这种情况下,两个字符的数组。

还有更短的方法来编写循环条件:

  1. 您可以使用普通零而不是'\0'while(*sPtr != 0)

  2. 您甚至可以省略比较,因为您要比较为零:while(*sPtr)

答案 3 :(得分:3)

您正在尝试将charchar 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)

  1. 您的状况应检查*sPTR != '\0'"\0"的类型为const char*
  2. 如果toupper传递了否定值,则会调用UB,因此请务必使用static_cast<unsigned char>Details
  3. 进行调用
  4. 您无需检查islowertoupper已经这样做
  5. 让您的生活更轻松,使用std::string

    void convertToUpper (std::string& str) {
     for (auto& v:str)
         v = toupper(static_cast<unsigned char>(v));
    }