【问题标题】:No conversion from "const char" to "int"没有从“const char”到“int”的转换
【发布时间】:2013-11-30 17:07:49
【问题描述】:

以下是问题代码。

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

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

对不起,我找不到。需要帮助。

感谢您的关注。

【问题讨论】:

  • 您的转换函数应该是单个 std::transform 调用或 ranged-for 循环。您无需检查它是否更低。

标签: c++ pointers


【解决方案1】:

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

while (*sPtr != "\0")

应该是

while (*sPtr != '\0')

【讨论】:

    【解决方案2】:

    试试

    while (*sPtr != '\0')
    

    修改字符串常量也可能出现段错误

    【讨论】:

      【解决方案3】:

      你的while循环的条件不对,你需要用单引号写while(*sPtr != '\0')

      解释:'\0' 是单个字符,"\0" 是字符串常量,即。 e.在这种情况下是两个字符的数组。

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

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

      2. 您甚至可以省略比较,因为您正在与零进行比较:while(*sPtr)

      【讨论】:

        【解决方案4】:

        您正在尝试将charchar const* 进行比较(嗯,实际上是char const[2],但这只是一个细节)。您可能打算使用

        while (*sPtr != '\0')
        

        while (*sPtr)
        

        请注意,不能保证您使用 islower()toupper() 可以正常工作:这些函数的参数必须是正数,但 char 可能有负值。您需要先将char 转换为unsigned char

        toupper(static_cast<unsigned char>(*sPtr))
        

        不需要islower() 的测试:在非较低chars toupper() 上只返回参数。省略 trst 可以提高性能。

        【讨论】:

          【解决方案5】:
          1. 你的while条件应该检查​​*sPTR != '\0'"\0"const char*类型
          2. 如果 toupper 被传递一个负值,你会调用 UB,所以请确保使用 static_cast&lt;unsigned char&gt; (Details) 调用它
          3. 您不需要检查islowertoupper 已经这样做了
          4. 让您的生活更轻松,使用std::string

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

          【讨论】:

            【解决方案6】:

            您只需将while (*sPtr != "\0") 更改为while (*sPtr != '\0')。您正在尝试将 char 与字符串进行比较。我同意@chris,不过,你不需要检查它是否是小写的。这样做很麻烦,而且不会减少算法的运行时间。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-03-08
              • 1970-01-01
              • 2015-01-05
              • 1970-01-01
              • 2012-03-30
              • 1970-01-01
              • 1970-01-01
              • 2014-09-20
              相关资源
              最近更新 更多