我删除了所有不必要的代码,所以没有人对我的问题感到太无聊......所以我不能让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)
与处理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指向指向的位置.该声明后两者cp并str1指向同一个字符串- "abcd".
*cp计算指向地址时存在的字符cp.在这种情况下,它将是a.
在第四个语句中,您将指定c为a,指向的地址处存在的字符cp.
现在,如果你尝试一个声明
*cp = str2;
Run Code Online (Sandbox Code Playgroud)
这是一个编译器错误.*cp简单地取消引用的地址cp.你可以把char在该位置,不str2,这是一个char*.
你可以执行
*cp = *str2;
Run Code Online (Sandbox Code Playgroud)
之后,在内存中的对象str1和cp点的样子:
+---+---+---+---+ | 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)