我遇到转换问题。我不能在这个程序中使用字符串,所以我必须使用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++
}
}
答案 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);
为什么需要这个?
char
s; 因此,当您将数组传递给C / C ++函数时,实际上是将指针传递给它们的第一个元素;对于泛型数组,你也可以在一个单独的参数中传递数组的大小(否则被调用的函数不知道何时停止检查数组),对于C字符串它不是必需的,因为按照惯例,它们在第一个' 0'字符(空终止符)。
为什么const
?因为你的函数不需要修改你传递给它的字符串,所以你清楚这个事实,并且允许你的调用者传递const
字符串而不会引起编译错误(理论上的字符串文字是{{1字符串,因为它们无法修改,但由于历史原因,它们可以隐式转换为const
。
顺便说一句,将一个大小的数组参数声明为函数本身并不是禁止的 - 但是,对于上述兼容性问题,无论如何它都被解释为指针。您会收到默认值的错误,因为您必须在函数的声明(= prototype)中指定它们,而不是在定义中指定它们。
最后,正如其他人注意到的,在你的函数调用中
char *
第二个参数是一个字符串(因为你用双引号括起来),它应该是一个简单的printText("I hear and I forget.", "*", 15);
(用单引号括起来)。
答案 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 ++好运!