通过函数传递字符串.C

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)

Pet*_*ter 5

你已经陷入了相信指针和数组是同一个东西的陷阱.他们不是.

按照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].这是用于初始化值baseWordmain()

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)