gpt4 book ai didi

C中字符变量字符串的大小

转载 作者:行者123 更新时间:2023-11-30 21:14:27 26 4
gpt4 key购买 nike

我正在尝试编写一个简单的 C 程序,其中 printf 询问您的姓名,然后使用 scanf 输入,但输出只给出姓名中的一个字母。这是我使用的代码:

#include <stdio.h>

main()
{

char cName;
cName = '\0';

printf("What is your name?: ");
scanf("%c", &cName);
printf("Good evening %c", cName);

}

输出:

What is your name?: Michael
Good evening M

当我声明变量时,我尝试将 [][20] 放在 cName 旁边,但这也不起作用。有人知道我做错了什么吗?

最佳答案

char cName[100];
printf("What is your name?: ");
scanf("%s", cName);
printf("Good evening %s", cName);
<小时/>

不...解释,这是我忘记的:

  1. char c;(很可能)是 1 字节长,也就是说,它在堆栈上仅分配 1 个字节。您的意图可能是将整个字符串读入其中,这是错误的。这就是为什么我将其替换为字符数组(限制为 99 个字符 + 空终止字符 \0):char cName[100];

  2. scanf("%c", &cName); 仅将一个字符读取到cName变量中。您应该使用 %s 格式扫描整个字符串,并将其存储到一个数组中(足够大以存储所有输入字符),方法是将地址传递给新创建的变量 cName.

  3. printf("Good night %c", cName); 它打印出单个字符,与 scanf 相同,您应该使用 % s 而是从数组中打印出字符序列,直到遇到空终止字符 (\0)。

<小时/>

Why for the single character &cName was necessary as 2nd argument, and now just cName for a string ?

这是因为我们更改了 scanf 初始化的格式字符串和目标。也就是说,scanf 需要初始化您的变量。您的变量在堆栈上分配,您需要做的就是传递其地址,以便scanf可以间接设置其值> 方式(通过指针)。

在 C 语言中,要获取变量的地址,通常使用与符号 - &。但是,对于数组(如 char cName[500]; 声明),数组的名称本身就是指向其第一个字符的指针。或者,您可以使用类似 &cName[0] 的语法来获取第一个字符的地址。

这就是为什么在单个字符的情况下,我们会说 &cName 来获取其地址,而在数组的情况下,我们会简单地说 cName

<小时/>

It is possible to overflow cName array!

是的,就是这样!您的数组现在只有 [100] 字符长。一些黑客现在可以输入更多字符,可能会覆盖您的堆栈。我们怎样才能让它更安全?非常简单地!我们可以通过证明长度说明符来限制在scanf本身中复制到数组的字符串的长度,如下所示:

scanf("%99s", cName);
<小时/>

Hold on a second! My array is 100-character-long, why do you allow only 99 in scanf ?

如果您想将 char 数组视为字符的字符串,则应以 a 结尾(即最后一个字符应设置为) 空终止符,由\0常量表示。 scanf 在读取所有输入符号后附加此字符。最后 100 个字符是为此目的而保留的。

<小时/>

Should I provide %99s to printf just like to scanf ?

不! %s 就足够了。当 printf 看到 %s 格式时,它知道打印出所有字符,直到遇到空终止字符。此外,printf 中的长度说明符实际上是一个最小宽度说明符,它为参数中的参数分配一个空间。输出流。

关于C中字符变量字符串的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25591090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com