Rob*_*len 2 c arrays string function
void printInstructions();
char *getUserWord();
int main()
{
printInstructions();
char *baseWord = getUserWord();
printf("%s", baseWord);
return 0;
}
void printInstructions()
{
printf(" Instructions: \n"
"===================================================================\n"
"= This program is a hangman game. =\n"
"= The first user will enter the name to be guessed =\n"
"= After that, the second user will guess the letters of the word =\n"
"= the second user will loose if they have three strikes =\n"
"===================================================================\n");
return;
}
char *getUserWord()
{
static char str[20];
scanf("%s", str);
return str;
}
Run Code Online (Sandbox Code Playgroud)
我的函数getUserWord通过传递一个字符串来完成它的任务.从我在线阅读的内容char *baseWord = getUserWord();是将字符串分配给main函数中变量的唯一方法.我不知道为什么这有效,我甚至不确定这在记忆中是做什么的.以下是对我有意义的事情.为什么这不起作用?
char baseWord[21];
baseWord = getUserWord();
Run Code Online (Sandbox Code Playgroud)
你已经陷入了相信指针和数组是同一个东西的陷阱.他们不是.
按照C中的约定,字符串通常表示为一个数组char,并'\0'在末尾附加一个附加的终结符(所谓的空字符).所以文字串"AB"被表示为3的阵列char与值'A','B'和'\0'.
指针与数组完全不同,因为字符串是使用数组表示的char,所以指针和字符串是完全不同的东西.指针是包含内存中地址的变量.
事情变得混乱的是,在许多上下文中,数组的名称被转换为指针.例如;
char x[] = "AB";
char *p = x;
Run Code Online (Sandbox Code Playgroud)
此赋值有效,但这并不意味着数组是指针,或指针是数组.而是将名称x转换为指向其第一个字符的指针.所以初始化在功能上等同于
char *p = &x[0];
Run Code Online (Sandbox Code Playgroud)
所以p指向'A'字符串中具有值的字符"AB".
你的代码也发生了同样的事情,所以
char *getUserWord()
{
static char str[20];
scanf("%s", str);
return str;
}
Run Code Online (Sandbox Code Playgroud)
相当于
char *getUserWord()
{
static char str[20];
scanf("%s", &str[0]);
return &str[0];
}
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,返回的指针getUserWord()都有一个值,该值是地址str[0].这是用于初始化值baseWord的main()
char *baseWord = getUserWord();
Run Code Online (Sandbox Code Playgroud)
因为baseWord现在指向数组的第一个字符,所以它可以被视为AS,如果它是一个数组.在C中,对于给定值i,这包括baseWord[i](in main())和str[i](in getUserWord())之间的等价.使用数组语法这一事实并不意味着指针和数组是同一个东西.它只是意味着他们可以使用相同的语法.
然而,要实现的重要一点是,可以从函数返回指针(并且返回的值分配给或用于初始化另一个指针),但数组不能.所以,main()这是合法的;
char *p = getUserWord();
p[0] = 'X'; /* will change str[0] in getUserWord() */
Run Code Online (Sandbox Code Playgroud)
但这不会是;
char array[20] = getUserWord();
Run Code Online (Sandbox Code Playgroud)