无法将Const Char [21]转换为Char?

时间:2012-08-25 22:16:49

标签: c++ pointers constants default-value

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

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 个答案:

答案 0 :(得分: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

会好得多

答案 1 :(得分:2)

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

printText更改为

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

为什么需要这个?

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

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

为什么const?因为你的函数不需要修改你传递给它的字符串,所以你清楚这个事实,并且允许你的调用者传递const字符串而不会引起编译错误(理论上的字符串文字是{{1字符串,因为它们无法修改,但由于历史原因,它们可以隐式转换为const


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


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

char *

第二个参数是一个字符串(因为你用双引号括起来),它应该是一个简单的printText("I hear and I forget.", "*", 15); (用单引号括起来)。


  1. IIRC它与B或BCPL的兼容性或其他方面有关,关键在于没有内在的理由说明数组无法通过值传递。

答案 2 :(得分:1)

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

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

因此,您需要前向声明printText(char, char, int);而不是printText(char*, char*, int)

同样,函数签名应该是:

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

答案 3 :(得分: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 ++好运!