0

我在转换时遇到问题。我不能在这个程序中使用字符串,所以我必须使用char's - 我收到错误:

error C2664: 'printText' : cannot convert parameter 1 from 'const char [21]' to 'char'
1>          There is no context in which this conversion is possible

我尝试将其转换为 const 指针:

void printText(const char* text[100] = "notextgiven"...

但这似乎没有帮助,给我的错误比什么都多。

我的程序:

#include <iostream>
using namespace std;

void printText(char, char, int);

int main(){
    printText("I hear and I forget.", "*", 15);
}

void printText(char text[100] = "notextgiven", char symbol = ' ', int repeat = 10){
    int temp = 0;
    while(temp < repeat){
        cout << symbol;
            temp++;
    }

    cout << text;

    temp = 0;
    while(temp < repeat){
        cout << symbol << endl;
            temp++
    }
}
4

4 回答 4

5

这不是为您尝试做的事情定义功能的正确方法

void printText(char text[100] = "notextgiven", char symbol = ' ', int repeat = 10)

试试这个

void printText(const char* text, char symbol, int repeat)

这应该允许您的程序编译。也改变这一行

 printText("I hear and I forget.", "*", 15);

printText("I hear and I forget.", '*', 15);
                                  ^ ^ 

单引号用于单个 char 变量,双引号将其视为字符串文字。由于这是家庭作业,您可能被要求专门使用char*,但由于您通常使用 C++,因此最好使用std::string

于 2012-08-25T22:21:29.790 回答
2

在您的原始函数中,您首先尝试将整个字符串放在一个字符内 - 这显然是不可能的。然后,您尝试了一个合理的解决方案,主要是由于历史原因,C++ 不允许这样做。

改变你printText

void printText(const char *, char, int);

为什么需要这个?

  • C 字符串是chars 的数组;
  • 数组不能在 C/C++ 中按值传递(无特殊原因1);
  • 数组的名称衰减为指向其第一个元素的指针,如果您有指向第一个元素的指针,则可以索引整个数组;

出于这个原因,当你将数组传递给 C/C++ 函数时,你实际上传递了一个指向它们的第一个元素的指针。对于通用数组,您还可以在单​​独的参数中传递数组的大小(否则被调用的函数将不知道何时停止检查数组),对于 C 字符串则不需要,因为按照惯例,它们以第一个 '\ 0' 字符(空终止符)。

为什么const?因为您的函数不需要修改您传递给它的字符串,所以您明确了这一事实,并且还允许您的调用者传递const字符串而不会产生编译错误(字符串文字理论上是const字符串,因为它们不能被修改,但char *由于历史原因,它们可以再次隐式转换)。


顺便说一句,向函数声明大小数组参数并不是天生禁止的 - 但是,对于上述兼容性问题,它无论如何都被解释为指针。默认值会出错,因为您必须在函数的声明(=prototype) 中指定它们,而不是在其定义中。


最后,正如其他人注意到的那样,在您的函数调用中

printText("I hear and I forget.", "*", 15);

第二个参数是一个字符串(因为你用双引号括起来),它应该是一个简单的char(用单引号括起来)。


  1. IIRC 它与与 B 或 BCPL 或其他什么的兼容性有关,关键是数组不能按值传递没有内在原因。
于 2012-08-25T22:20:02.653 回答
1

您尝试将字符串传递给函数,根据您的设置方式,该函数仅接受单个字符。

printText需要将其参数作为char*而不是char(即:作为字符序列而不是单个字符)。

因此,printText(char, char, int);您需要将前向声明改为printText(char*, char*, int).

同样,函数签名应该是:

void printText(char* text = "notextgiven", char* symbol = " ", int repeat = 10)

于 2012-08-25T22:22:02.140 回答
0

请注意,您在原始标题中描述的错误消息与您的实际错误消息并不完全相同。(我冒昧地改变了这一点。)最后的“[21]”非常重要。特别是“[]”符号代表一个数组。所以编译器告诉你你正试图从一个字符数组转换为一个字符。由于一个数组可以容纳多个字符,编译器抱怨它不能做到这一点的原因应该很明显了。

有了这个解释,让我们看看如何修复你的代码。有三行导致您的代码出现问题:

函数声明

void printText(char, char, int); 

函数调用

printText("I hear and I forget.", "*", 15); 

函数定义

void printText(char text[100] = "notextgiven", char symbol = ' ', int repeat = 10){ 
   //...
}

这是创建自己的功能的三个要素,它们必须全部匹配!如果他们不这样做,编译器会抱怨。因此,让我们分析这些部分。首先声明:

void printText(char, char, int); 

在这里,您声明了一个名为“printText”的函数,它需要三个输入(两个字符和一个整数)并且没有输出(“void”)。

现在看函数定义:

void printText(char text[100] = "notextgiven", char symbol = ' ', int repeat = 10){ 
   //...
}

定义了一个名为“printText”的函数,它有三个输入,没有输出。不过,仔细看看。这个“printText”函数需要一个字符数组、一个字符和一个整数作为其输入。因为这个输入列表与声明中的不同,这实际上是一个与声明的完全不同的函数。

我还想在这里提一下,函数定义定义了函数的实际作用。这是“{”和“}”之间的代码。另一方面,函数声明只是声明函数存在于某处,但没有说明函数内部发生了什么。为了满足编译器,我们需要两者。(从技术上讲,也涉及链接器,但该细节对当前问题并不重要。)

还有一件事:您的函数提供带有“=”的默认参数。我怀疑这不是你想要的。由于您刚刚开始,我强烈建议您删除这些,因为它们只会使事情复杂化。当您对函数更加熟悉时,您可以了解默认参数。

最后,我们看一下函数调用:

printText("I hear and I forget.", "*", 15); 

由于这一行出现在 main() 函数中,它告诉 printText() 函数做它的事情。这一行还提供了 printText() 函数的输入。请注意,此处给出的输入是两个字符串(或字符数组)和一个整数。(双引号内的任何内容 -- "" -- 都是一个字符串,也相当于一个字符数组。)现在这与函数声明所描述的输入列表不匹配,因此编译器会尝试转换您对所列类型的输入。编译器抱怨,因为它无法这样做。

我怀疑您实际上想将第三个参数更改为'*'. 注意单引号。这就是您在 C++(和大多数其他编程语言)中指示单个字符的方式。

我希望这个解释能帮助你理解你的代码发生了什么。祝你学习 C++ 好运!

于 2012-08-25T22:50:06.877 回答