C 为什么我的程序没有编译?
我的代码应该初始化您键入的任何单词,但它拒绝编译 . 我不明白它给我的错误信息 1 initialize.c:24:23:错误:将“char”传递给“const char*”类型的参数的整数到指针转换不兼容;拿 地址与&[-Werror,-Wint转换] 2 initialize.c:21:23:错误:格式字符串不是字符串文字(可能不安全)[-Werror,-Wformat security] 3 initialize.c:21:23:错误:格式字符串不是字符串文字(可能不安全)[-Werror,-Wformat security] printf(toupper(s[i])C 为什么我的程序没有编译?,c,cs50,C,Cs50,我的代码应该初始化您键入的任何单词,但它拒绝编译 . 我不明白它给我的错误信息 1 initialize.c:24:23:错误:将“char”传递给“const char*”类型的参数的整数到指针转换不兼容;拿 地址与&[-Werror,-Wint转换] 2 initialize.c:21:23:错误:格式字符串不是字符串文字(可能不安全)[-Werror,-Wformat security] 3 initialize.c:21:23:错误:格式字符串不是字符串文字(可能不安全)[-Werror
#包括
#包括
#包括
#包括
无效初始化(字符串s);
int main(int argc,字符串argv[])
{
printf(“请问您贵姓?”;
string name=GetString();
初始化(名称);
}
无效初始化(字符串s)
{
int空间=1;
对于(int i=0;i
需要一个类型为const char*
的格式字符串作为其第一个参数,因此:
改变
printf(toupper(s[i]));
到
正如@Matt McNabb所指出的,这里也有类似的问题。因为您倾向于只比较第一个字符,所以您可以选择更改
if(strncmp(s[i]," ",1 ) )
到
使其更清晰、更有效。要求使用类型为const char*
的格式字符串作为其第一个参数,因此:
改变
printf(toupper(s[i]));
到
正如@Matt McNabb所指出的,这里也有类似的问题。因为您倾向于只比较第一个字符,所以您可以选择更改
if(strncmp(s[i]," ",1 ) )
到
使其更清晰、更有效。以下是使其可移植后的代码 但不处理用户输入错误 它有必要的更正,因此它可以干净地编译
#include <stdio.h>
#include <stdlib.h>
//#include <cs50.h>
#include <string.h>
#include <ctype.h>
void initialize(char * s);
int main( void )
{
printf("May I have your name?");
char name[50] = {'\0'};
fgets(name, sizeof(name), stdin ); // should check returned value
// to assure the line input was successful
initialize(name);
return 0;
} // end function: main
void initialize(char * s)
{
int space = 1;
for (size_t i = 0;i < strlen(s); i++)
{
if(space == 1)
{
printf("%c", toupper(s[i]));
space -= 1;
}
if( ' ' == s[i] ) // always place literal on left so compiler
// catches any place where '=' was used
// when it should have been '=='
{
space += 1;
}
}
} // end function: initialize
#包括
#包括
//#包括
#包括
#包括
无效初始化(字符*s);
内部主(空)
{
printf(“请问您贵姓?”;
字符名[50]={'\0'};
fgets(name,sizeof(name),stdin);//应检查返回值
//确保线路输入成功
初始化(名称);
返回0;
}//结束函数:main
无效初始化(字符*s)
{
int空间=1;
对于(大小i=0;i
这是使其可移植后的代码
但不处理用户输入错误
它有必要的更正,因此它可以干净地编译
#include <stdio.h>
#include <stdlib.h>
//#include <cs50.h>
#include <string.h>
#include <ctype.h>
void initialize(char * s);
int main( void )
{
printf("May I have your name?");
char name[50] = {'\0'};
fgets(name, sizeof(name), stdin ); // should check returned value
// to assure the line input was successful
initialize(name);
return 0;
} // end function: main
void initialize(char * s)
{
int space = 1;
for (size_t i = 0;i < strlen(s); i++)
{
if(space == 1)
{
printf("%c", toupper(s[i]));
space -= 1;
}
if( ' ' == s[i] ) // always place literal on left so compiler
// catches any place where '=' was used
// when it should have been '=='
{
space += 1;
}
}
} // end function: initialize
#包括
#包括
//#包括
#包括
#包括
无效初始化(字符*s);
内部主(空)
{
printf(“请问您贵姓?”;
字符名[50]={'\0'};
fgets(name,sizeof(name),stdin);//应检查返回值
//确保线路输入成功
初始化(名称);
返回0;
}//结束函数:main
无效初始化(字符*s)
{
int空间=1;
对于(大小i=0;i
我的编译器正在运行另一个问题是strncmp(s[i],“”,1)
s[i]
不是字符串。我猜你的意思是s[I]='
。强烈建议不要使用头文件cs50.h,因为它不可移植。要允许不包含cs50.h,请在编译时将“字符串”类型(3个位置)更改为“char*”,始终启用所有警告。(对于gcc,至少使用“-Wall-Wextra-pedantic”),然后修复警告。一个好的开始是:不使用主参数,因此将main()函数声明更改为:“int main(void)”strlen()、sizeof()等,返回一个“size\t”,它被定义为“unsigned long int”而不是“int”,因此在进行比较时,最好是所有参与比较的各方都是“unsigned long int”,我的编译器是clango,另一个问题是strncmp(s[i],“”,1)
s[i]
不是字符串。我猜你的意思是s[I]='
。强烈建议不要使用头文件cs50.h,因为它不可移植。要允许不包含cs50.h,请在编译时将“字符串”类型(3个位置)更改为“char*”,始终启用所有警告。(对于gcc,至少使用“-Wall-Wextra-pedantic”),然后修复警告。一个好的开始是:不使用主参数,因此将main()函数声明更改为:'int main(void)'strlen(),sizeof(),等等返回一个'size\t',该'size\t'定义为'unsigned long int'而不是'int',因此在进行比较时,最好所有参与比较的方都是'unsigned long int'