通过';无效';至不兼容类型的参数';const char*';?
当我运行下面的代码时,我在这一行得到一个“将'void'传递给不兼容类型'const char*'的参数”错误:通过';无效';至不兼容类型的参数';const char*';?,c,xcode,compiler-errors,xcode11,C,Xcode,Compiler Errors,Xcode11,当我运行下面的代码时,我在这一行得到一个“将'void'传递给不兼容类型'const char*'的参数”错误: int result = strcmp(lowerCase(input), answers[i]); 错误所在的代码为: for (int i = 0; i <= sizeof(questions); i++) { printf("%s", questions[i]); scanf("%s", input); int result = strcmp(
int result = strcmp(lowerCase(input), answers[i]);
错误所在的代码为:
for (int i = 0; i <= sizeof(questions); i++)
{
printf("%s", questions[i]);
scanf("%s", input);
int result = strcmp(lowerCase(input), answers[i]);
if (result == 0)
{
score++;
}
}
for(int i=0;i='a'&s[c]编译器投诉
不能将不返回值的函数返回的值传递给另一个函数(因此会出现关于void
和const char*
的错误消息)
由于lowerCase()
不返回值(其返回类型为void
),因此无法执行以下操作:
strcmp(lowerCase(input), answers[i]);
您可以使用:
lowerCase(input);
int result = strcmp(input, answers[i]);
或者,修改lowerCase()
,使其返回一个char*
,并以returns;
结束(然后不需要将调用更改为strcmp()
)
重写lowerCase()
由于包含
,因此可以编写:
void小写(char s[]
{
int c=0;
而(s[c]!='\0'){
if(isupper((无符号字符)s[c])){
s[c]=tolower((无符号字符)s[c]);
}
C++;
}
}
或:
char*小写(char s[]
{
对于(int c=0;s[c]!='\0';c++)
s[c]=tolower((无符号字符)s[c]);
返回s;
}
如果纯char
是有符号类型,则强制转换是必需的。强制转换采用int
,它是EOF或转换为无符号char
的字符值
无需测试字符是否为小写;tolower()
函数保留所有不是大写的内容不变,这也是使用这些函数的额外优势
其他问题
在问题
和答案
中有3个元素,但每个元素只初始化一个。当循环到索引1时,会得到空指针-因此错误消息中出现地址=0x0
。您尝试从空指针读取数据;执行此操作后通常会发生崩溃
另外,sizeof(questions)
几乎肯定是24—存储三个64位指针所需的字节数。如果您添加额外的两个问题和答案,则循环限制需要sizeof(questions)/sizeof(questions[0])
因为您将输入转换为所有小写,所以永远不会得到与答案匹配的输入(混合大小写)
答案字符串存储在字符串文字中。如果您试图使用lowerCase()
修改答案,您会遇到崩溃,因为字符串文字存储在只读内存中。您无法将不返回值的函数返回的值传递给另一个函数(因此出现了关于void
和const char*
)的错误消息。因为lowerCase()
不返回值(其返回类型为void
),所以您不能执行:strcmp(小写(输入),答案[i]);
。您可以调用小写(输入);
,然后int result=strcmp(输入,答案[i]);
。或者,修改lowerCase()
,使其返回一个char*
,并以return s;
结束。非常感谢,这消除了错误。但是,当我返回s;,我得到另一个错误:线程1:EXC_BAD_ACCESS(code=1,address=0x0)。请参阅我更新答案的尾部部分以获得解释(至少指一些)法典中进一步的问题。
strcmp(lowerCase(input), answers[i]);
lowerCase(input);
int result = strcmp(input, answers[i]);