C 为什么我的程序没有编译?

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

我的代码应该初始化您键入的任何单词,但它拒绝编译 . 我不明白它给我的错误信息

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])

#包括
#包括
#包括
#包括
无效初始化(字符串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'