char指针:从'char*'到'char'的无效转换?

Dic*_*321 2 c pointers char

我删除了所有不必要的代码,所以没有人对我的问题感到太无聊......所以我不能让char数组工作!在最后几行

*whatname = guyname; 
*whatlastname = lastname;
Run Code Online (Sandbox Code Playgroud)

我收到一条错误,指出从'char*'到'char'的无效转换.非常感谢帮助!

#include <stdio.h>
#include <ctype.h>
#include <string.h>

void getname(char *whatname, char *whatlastname);

int main()
{
    int option = 0;
    char guyname = 'x';
    char lastname = 'x';
    bool name_entered = false;

    do{
        printf("1. Enter name.\n");
        printf("2. Enter exam scores.\n");
        printf("3. Display average exam scores. \n");
        printf("4. Display summary. \n");
        printf("5. Quit. \n");
        scanf("%i", &option);

        if( option == 1 )
        {
            name_entered = true;
            getname(&guyname, &lastname);
        }
    else if( option == 4 )
    {
        {
            printf("%s %s based on your exam scores of \n",guyname, lastname);
        }
        else
        {
            printf("Please enter your name in option 1 and you exam scores in option 2 before continuing.\n");
        }
    }
        else if( option == 5 )
        {
            printf(" Come back with a better grade next time.");
            break;
        }
    }while (!(option >5 || option <1));
    return 0;
}

void getname (char *whatname, char *whatlastname)
{
    char guyname[32];
    char lastname[32];
    printf("Enter your first and last name : ");
    scanf("%s %s", &guyname, &lastname);

    guyname[0] = toupper( guyname[0] );
    int len = strlen(guyname);
    for(int i=1; i<len ; i++)
    {
        guyname[i] = tolower( guyname[i]);
    }

    lastname[0] = toupper( lastname[0] );
    int len1 = strlen(lastname);
    for(int k=1; k<len1; k++)
    {
        lastname[k]= tolower( lastname[k]);
    }

    printf("Your name is %s %s\n", guyname, lastname);
    *whatname = guyname;
    *whatlastname = lastname;
}
Run Code Online (Sandbox Code Playgroud)

R S*_*ahu 7

与处理char,char*以及char []在C是在一开始有点混乱.

看看以下陈述:

char str1[] = "abcd";
char const* str2 = "xy";
char* cp = str1;
char c = *cp;
Run Code Online (Sandbox Code Playgroud)

在第一个语句中,第二个语句的行为相同.执行第一个语句后str1,按连续顺序指向包含4个字符的位置.如果您考虑字符串的内存位置,您可能会看到如下内容:

+---+---+---+---+
| a | b | c | d |
+---+---+---+---+

str1指向a存储的地址.存在用于将字符串"xyz"str2点存储到x存储的地址的类似布置.

在第三个声明中,您正在创建cp使其str1指向指向的位置.该声明后两者cpstr1指向同一个字符串- "abcd".

*cp计算指向地址时存在的字符cp.在这种情况下,它将是a.

在第四个语句中,您将指定ca,指向的地址处存在的字符cp.

现在,如果你尝试一个声明

*cp = str2;
Run Code Online (Sandbox Code Playgroud)

这是一个编译器错误.*cp简单地取消引用的地址cp.你可以把char在该位置,不str2,这是一个char*.

你可以执行

*cp = *str2;
Run Code Online (Sandbox Code Playgroud)

之后,在内存中的对象str1cp点的样子:

+---+---+---+---+
| x | b | c | d |
+---+---+---+---+

如果要将字符串从指向的地址复制str1到指定的地址cp,可以使用标准库函数strcpy.

strcpy(cp, str2);
Run Code Online (Sandbox Code Playgroud)

您必须小心使用,strcpy因为您必须有足够的有效内存才能复制到.在这个特定的例子中,如果你尝试过

char str3[2];
strcpy(str3, cp);
Run Code Online (Sandbox Code Playgroud)

您将获得未定义的行为,因为没有足够的内存str3可以复制 "abcd".

希望有道理.

以下是应该运行的代码的修改版本:

#include <stdio.h>
#include <ctype.h>
#include <string.h>

void getname(char *whatname, char *whatlastname);

int main()
{
    int option = 0;
    char guyname[32];
    char lastname[32];
    bool name_entered = false;

    do{
        printf("1. Enter name.\n");
        printf("2. Enter exam scores.\n");
        printf("3. Display average exam scores. \n");
        printf("4. Display summary. \n");
        printf("5. Quit. \n");
        scanf("%i", &option);

        if( option == 1 )
        {
            name_entered = true;
            getname(guyname, lastname);
        }
        else if( option == 5 )
        {
            printf(" Come back with a better grade next time.");
            break;
        }
    }while (!(option >5 || option <1));
    return 0;
}

void getname (char *whatname, char *whatlastname)
{
    char guyname[32];
    char lastname[32];
    printf("Enter your first and last name : ");
    scanf("%31s %31s", guyname, lastname);

    guyname[0] = toupper( guyname[0] );
    int len = strlen(guyname);
    for(int i=1; i<len ; i++)
    {
        guyname[i] = tolower( guyname[i]);
    }

    lastname[0] = toupper( lastname[0] );
    int len1 = strlen(lastname);
    for(int k=1; k<len1; k++)
    {
        lastname[k]= tolower( lastname[k]);
    }

    printf("Your name is %s %s\n", guyname, lastname);
    strcpy(whatname, guyname);
    strcpy(whatlastname,lastname);
}
Run Code Online (Sandbox Code Playgroud)