2012-08-25 73 views
0

我遇到转换问题。我不能使用字符串在这个节目,所以我不得不使用char的 - 我得到的错误:不能将Const Char [21]转换为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 

我试图将其转换为一个常量指针:

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

,但它不“ t似乎有所帮助,给了我更多的错误。

我的计划:

#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++ 
    } 
} 
+0

此外,'“*”''应该是''*''而不是... – 2012-08-25 22:21:43

+0

你知道字符(字符)和字符串之间有什么区别吗? – jalf

+1

@Derp不要更新代码来回答你的问题。保持原样。如果其他人出现这个问题,并且发现代码中没有错误,但是看到你正在寻求帮助解决一些不存在的问题?他们会感到困惑。下次,请不要更改您的问题或您的代码。您应该这样做的唯一原因是为了清晰起见。 – 0x499602D2

回答

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*,但由于您一般使用C++,因此使用std::string

+0

我给该函数默认值。另外,作为作业,我不能使用字符串。 – Derp

+0

在这种情况下,您通常在函数声明而不是实现中指定它们。 – mathematician1975

+0

@Derp如果你想给函数默认值,那么在函数声明中给它们,而不是在函数定义中。 –

2

在你原有的功能,你第一次尝试把整个字符串的单个字符内 - 这显然是不可能的。然后,您尝试了一种合理的解决方案,C++主要出于历史原因而不允许这样做。

更改printText

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

这是为什么需要?

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

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

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


顺便说一句,这不是天生禁止一大小的数组参数声明的功能 - 但是,对于上述的兼容性问题,它无论如何解释为指针。由于必须在函数的声明(=原型)中指定它们,而不是在其定义中指定它们,所以会出现错误和默认值。


最后,作为其他注意到了,在你的函数调用

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

第二个参数是一个字符串(因为你在双引号吧),当它应该是一个简单char(括在单引号)。


  1. IIRC它有事情做与B或BCPL或任何兼容性问题是,有没有内在的原因,数组不能按值传递。
1

您尝试将字符串传递给函数,根据设置它,只接受一个字符。

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

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

同样函数签名应该是:

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

+0

当我添加指针值时,当我尝试添加默认参数时出现错误。告诉我这是不相容的。 – Derp

+0

这应该很好,至少它对我来说(使用VC++)。也许这是一个编译器的事情。确保将默认值添加到函数定义中,而不是添加到声明中(所以函数体所在的位置)。 – s3rius

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 printText(char text[100] = "notextgiven", char symbol = ' ', int repeat = 10){ 
    //... 
} 

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

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

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

最后,让我们来看看在函数调用:

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

由于该行出现在main()函数,它告诉printText()函数来完成它的事。这一行还提供了printText()函数的输入。请注意,这里给出的输入是两个字符串(或字符数组)和一个整数。 (双引号内的任何内容 - “” - 是一个字符串,它也相当于一个字符数组。)现在这与函数声明描述的输入列表不匹配,所以编译器试图转换您输入的类型列出。编译器抱怨,因为它不能这样做。

我怀疑你实际上想把第三个参数改为'*'。请注意单引号。这就是你如何用C++(和大多数其他编程语言)表示单个字符。

我希望这个解释能帮助你理解你的代码是怎么回事。祝你好运,学习C++!

相关问题