[英]Signed/unsigned mismatch and function does not take 2 arguments when converting to function
因此,我能够编写一个程序,将字符串转换为摩尔斯电码,但老师希望我将其转换为函数中的转换部分,但是它给出了警告C4018的错误:'<':有符号/无符号不匹配n第29行和错误C2660:'toMorse':函数在第18行上没有2个参数,您会认为在能够正常运行程序之后,这会有些麻烦,但此时我的脑袋已经死了。 尽管我想我可以把所有的工作都放在main {}中,但对找出为什么这样做的任何帮助将不胜感激。
#include <iostream>
#include <string>
using namespace std;
// Function Prototypes
string toMorse(char);
int main()
{
string userInput;
cout << "Please input a string to convert to morse code." << endl;
getline(cin, userInput, '\n');
int stringSize = userInput.length();
toMorse(userInput, stringSize);
}
//*****************************************************************
//Function to convert into morse code
//*****************************************************************
string toMorse(string morseArray, int stringSize)
{
string *toConvert = new string[stringSize];
for (size_t i = 0; i < stringSize; i += 1)
{
if (toupper(userInput.at(i)) == 'A')
toConvert[i] = ".-";
// will fill in the rest once problems are solved
else toConvert[i] = " ";
}
for (size_t x = 0; x < stringSize; x += 1)
cout << toConvert[x] << " ";
cout << endl;
delete[] toConvert;
return 0;
}
因此,我能够通过给出的提示使它正常工作,但是现在每次我运行以下代码(它正确翻译时,当我按Enter时,它都显示正确的输入,但同时显示“调试断言失败!表达式:无效的空指针在MSVCP120D.dll第1168行上
#include <iostream>
#include <string>
using namespace std;
// Function Prototypes
string toMorse(string, size_t);
int main()
{
string userInput;
cout << "Please input a string to convert to morse code." << endl;
getline(cin, userInput, '\n');
int stringSize = userInput.length();
toMorse(userInput, stringSize);
}
//*****************************************************************
//Function to convert into morse code
//*****************************************************************
string toMorse(string morseArray, size_t stringSize)
{
string *toConvert = new string[stringSize];
for (size_t i = 0; i < stringSize; i += 1)
{
if (toupper(morseArray.at(i)) == ' ')
toConvert[i] = " ";
else if (toupper(morseArray.at(i)) == ',')
toConvert[i] = "--..--";
else if (toupper(morseArray.at(i)) == '.')
toConvert[i] = ".-.-.-";
else if (toupper(morseArray.at(i)) == '?')
toConvert[i] = "..--..";
else if (morseArray.at(i) == '0')
toConvert[i] = "-----";
else if (morseArray.at(i) == '1')
toConvert[i] = ".----";
else if (morseArray.at(i) == '2')
toConvert[i] = "..---";
else if (morseArray.at(i) == '3')
toConvert[i] = "...--";
else if (morseArray.at(i) == '4')
toConvert[i] = "....-";
else if (morseArray.at(i) == '5')
toConvert[i] = ".....";
else if (morseArray.at(i) == '6')
toConvert[i] = "-....";
else if (morseArray.at(i) == '7')
toConvert[i] = "--...";
else if (morseArray.at(i) == '8')
toConvert[i] = "---..";
else if (morseArray.at(i) == '9')
toConvert[i] = "----.";
else if (toupper(morseArray.at(i)) == 'A')
toConvert[i] = ".-";
else if (toupper(morseArray.at(i)) == 'B')
toConvert[i] = "-...";
else if (toupper(morseArray.at(i)) == 'C')
toConvert[i] = "-.-.";
else if (toupper(morseArray.at(i)) == 'D')
toConvert[i] = "-..";
else if (toupper(morseArray.at(i)) == 'E')
toConvert[i] = ".";
else if (toupper(morseArray.at(i)) == 'F')
toConvert[i] = "..-.";
else if (toupper(morseArray.at(i)) == 'G')
toConvert[i] = "--.";
else if (toupper(morseArray.at(i)) == 'H')
toConvert[i] = "....";
else if (toupper(morseArray.at(i)) == 'I')
toConvert[i] = "..";
else if (toupper(morseArray.at(i)) == 'J')
toConvert[i] = ".---";
else if (toupper(morseArray.at(i)) == 'K')
toConvert[i] = "-.-";
else if (toupper(morseArray.at(i)) == 'L')
toConvert[i] = ".-..";
else if (toupper(morseArray.at(i)) == 'M')
toConvert[i] = "--";
else if (toupper(morseArray.at(i)) == 'N')
toConvert[i] = "-.";
else if (toupper(morseArray.at(i)) == 'O')
toConvert[i] = "---";
else if (toupper(morseArray.at(i)) == 'P')
toConvert[i] = ".--.";
else if (toupper(morseArray.at(i)) == 'Q')
toConvert[i] = "--.-";
else if (toupper(morseArray.at(i)) == 'R')
toConvert[i] = ".-.";
else if (toupper(morseArray.at(i)) == 'S')
toConvert[i] = "...";
else if (toupper(morseArray.at(i)) == 'T')
toConvert[i] = "-";
else if (toupper(morseArray.at(i)) == 'U')
toConvert[i] = "..-";
else if (toupper(morseArray.at(i)) == 'V')
toConvert[i] = "...-";
else if (toupper(morseArray.at(i)) == 'W')
toConvert[i] = ".--";
else if (toupper(morseArray.at(i)) == 'X')
toConvert[i] = "-..-";
else if (toupper(morseArray.at(i)) == 'Y')
toConvert[i] = "-.--";
else if (toupper(morseArray.at(i)) == 'Z')
toConvert[i] = "--..";
else toConvert[i] = " ";
}
for (size_t x = 0; x < stringSize; x += 1)
cout << toConvert[x] << " ";
cout << endl;
delete[] toConvert;
return 0;
}
非常感谢。 通过将其更改为适当的返回类型,我能够使其运行无错误。 再次感谢。 并感谢大家的帮助!
C4018警告是关于比较。 您可以使用如下函数原型:
string toMorse(string morseArray, size_t stringSize);
另外,您已经将toMorse
函数定义为string toMorse(char);
在文件的开头,这与下面的内容有所不同。
另一个错误行userInput
应该在if (toupper(userInput.at(i)) == 'A')
说morseArray
。
另外,为什么要用size_t i = 0
而不是int i = 0
初始化for循环?
在更新的版本中, toMorse
函数定义为将string
作为返回类型。
但是你写了return 0;
。 这使用0
作为参数构造一个字符串,该字符串被视为空指针。 (这是C的宿醉)。 这将导致未定义的行为,其本身表现为“调试断言失败”。 带有指针的string
的构造函数希望它是指向某些字符的指针。
要解决此问题,请将函数更改为返回void
,或者返回有效的字符串。 函数名称建议应返回摩尔斯电码字符串,而不是将其发送给cout
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.