【问题标题】:'itoa' : function does not take 1 arguments & 'c' : undeclared identifier'itoa' : 函数不接受 1 个参数 & 'c' : 未声明的标识符
【发布时间】:2012-07-29 04:35:23
【问题描述】:

我已经尝试了 2 天来让这段代码正常工作。这只是一个又一个错误。

谁能指出我做错了什么?

#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;

int main()
{
    int h = 0;
    for(int a = 100; a<1000; a++)
        for(int b = 100; b<1000; b++)
            int c = a * b;
// Error: "c" is undefined
            if ((c == reverse(c)) && (c > h))
                h = c;
    cout << "The answer is: " << h << endl;
}

int reverse (int x)
{
// Error: "'itoa' : function does not take 1 arguments"
    string s = string(itoa(x));
    reverse(s.begin(), s.end());
  return (x);
}

使用 std::to_string 也会给我更多错误。

【问题讨论】:

  • 听你的编译器。它告诉你问题是什么。 ...does not take 1 arguments...,这告诉您以下两件事之一:1. 您正在向不接受任何参数的函数发送一个参数(在这种情况下极不可能),或者 2. 当您发送一个参数时函数至少需要两个,但可以是n(Arg)。如果n=100 并且您发送99 它会说“...函数不接受99 个参数”。
  • ..function does not take 99 arguments...。当你超过它时也是如此,说同样的话!当您发送正确数量的参数时,它将正确编译。
  • 通过进一步查看您的代码,以及您在 cmets 中对其他答案的持续沮丧,我建议您使用大括号,即使它们不是“需要”的!特别是如果您不断遇到简单的错误。如果您可以在观看 Seinfield 的同时破解代码,请忽略它们。我按要求使用它们!
  • 也许你应该问一下如何解决你在使用std::to_string 时遇到的问题,它比 itoa 好 14 倍,而且是标准的。
  • 仅供参考:在您有一个或多个程序员(您)定义了接受n (+/-) x 参数的重载函数的情况下,您不会收到该错误消息,但可能会得到意想不到的结果。

标签: c++ string itoa


【解决方案1】:

当您的编译器在错误消息中向您解释某些内容时,您应该相信它。实际上,itoa 确实接受了多个参数,如您在以下链接中所见:

http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/

编辑:哦,顺便说一句,这可以使用标准的 C++ 样式代码来实现(根据 cmets 中的建议修复了一些代码):

int reverse(int x)
{
    std::stringstream ss;
    ss << x;

    std::string s = ss.str();
    std::reverse(s.begin(), s.end());

    ss.clear();
    ss.str(s.c_str());

    ss >> x;

    return x;
}

这里。不确定这是最干净的解决方案,但它适用于我的编译器。

编辑:在此处了解如何仅使用一个字符串流:How to clear stringstream?

【讨论】:

  • “错误:不存在从“std::stringstream”到“std::string”的合适的用户定义转换”以及更多错误:/
  • @LuchianGrigore:我不否认这一点,尽管在修复我自己的解决方案时我不想复制你的解决方案。如果人们觉得你的更好,他们可以投票(确实更短)。
  • 我刚刚测试了您的解决方案,但它似乎没有工作(没有逆转)而这个工作。我想知道是否可以只使用一个字符串流。我没有用 clear() 或 flush() 清空它,所以我不得不求助于使用一个作为输入,另一个作为输出。
  • "'void std::reverse(_BidIt,_BidIt)' : 需要 2 个参数 - 提供 1 个", "'reverse' : 局部函数定义是非法的", "(7): 此行包含一个尚未匹配的'{'”,“在左大括号'{'之前找到文件结尾”。我觉得 c++ 讨厌我哈哈。
  • 再听编译器!搜索错误引用的行并查看可能与错误消息匹配的内容。 end of file found before left brace.. 就是这个意思。
【解决方案2】:

我可以提出不同的解决方案吗?除了进行 intstring 转换,您还可以通过这种方式测试一个数字是否为回文:

bool is_palindrome(int number, int base = 10)
{
    int rebmun = 0;
    for (int temp = number; temp != 0; temp /= base) {
        rebmun = (rebmun * base) + (temp % base);
    }
    return number == rebmun;
}

那么你的测试就变成了:

if (is_palindrome(c) && (c > h))

【讨论】:

  • 看起来不错,您能详细解释一下吗?我真的不明白它的作用,只是它有效。
  • @Leinad177:关键思想是使用temp % 10 来隔离temp 的最低有效数字。循环的每一步都将rebmun 乘以10 以将值“向左”移动,然后将temp 的最后一位数字相加。直到temp 变为零,数字从temp 移动到rebmun 一次。请注意参数base 对于十进制数默认为 10,但您可以传递 2 来测试二进制(以 2 为底)回文。这将解决另一个 Project Euler 问题:)
【解决方案3】:

对于第一个问题,正确的缩进可能会清楚:

int h = 0;
for(int a = 100; a<1000; a++)
    for(int b = 100; b<1000; b++)
        int c = a * b;

if ((c == reverse(c)) && (c > h))
    h = c;

加上一些额外的括号:

int h = 0;
for(int a = 100; a<1000; a++)
{
    for(int b = 100; b<1000; b++)
    {
        int c = a * b;
        if ((c == reverse(c)) && (c > h))
            h = c;
    }
}

至于itoa问题,其签名为:

char *  itoa ( int value, char * str, int base );

所以你不能只写itoa(x) 并期望它返回一个字符串。

在 C++ 中,有更好的方法可以将 int 转换为 string

  • 如果你有 C++11,有std::to_string
  • 否则,std::stringstream 将完成这项工作。

像这样:

#include <sstream>

int reverse (int x)
{
    std::stringstream ss;
    ss << x;
    string s(ss.str());
    reverse(s.begin(), s.end());
    return (x);
}

请注意,虽然这不会返回 int 反转。

【讨论】:

  • 啊好吧,我将如何让它返回 int 反转?
  • @Leinad177 不同的问题。
  • 您在字符串之前和反向之前缺少一个 std::,并且 ss.str() 函数调用缺少括号。
  • @AlexandreP.Levasseur 在文件的开头有一个using namespace std;,所以不需要限定。
  • 没看到(尽管您在 stringstream :D 之前使用 std:: )。
猜你喜欢
  • 2013-08-19
  • 2014-03-05
  • 1970-01-01
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
相关资源
最近更新 更多