C中char数据类型的大小,其格式为%s或%C



在互联网上,我发现C编程中的char信息如下:

Datatype        Size        Range           Format
char            1 byte     −128 to 127        %c
signed char     1 byte     −128 to 127        %c
unsigned char   1 byte        0 to 255        %c

但我知道存在char(数据类型)的格式%s,它用于处理字符串。我的问题是:这两种格式的大小和范围有什么不同吗谢谢大家!

char是单个字符/字母,例如用"%c"'X'打印
使用"%s"打印的是一个由多个字符组成的以零结尾的字符串,可以给出例如"foobar"。注意不同的引号
(顺便说一句,在处理它们并试图存储它们时,一个常见的错误是没有足够的空间容纳最后的零。通常需要比显而易见的多一个。)

比较https://en.cppreference.com/w/cpp/io/c/fprintf

%s通常所指的"范围"很难定义。可能是书。

%s打印的内容有时被描述为"C伪字符串",但没有这样的数据类型。

C中的字符串的定义类似于一个包含以零字符"\0"结尾的字符序列的字符数组。

例如,字符串文字"Hello"的类型为char[6](考虑到终止的零字符)。因此算子CCD_ 10产生值CCD_。

转换说明符%s被指定为输出字符串,并等待指向字符串的第一个字符的指针。字符串的大小仅受所用系统的资源限制,并且不能大于存储在类型size_t中的最大值。

转换说明符CCD_ 14被设计为输出类型为CCD_。类型为char的对象的大小等于1(sizeof(char )等于1)。请记住,在C中,文字的类型为int。例如,sizeof("A")产生4(如果int类型的对象的大小等于4)。

这是一个演示程序

#include <stdio.h>
int main(void) 
{
printf( "sizeof( "Hello" ) = %zun", sizeof( "Hello" ) );
char c = 'A';
printf( "sizeof( char ) = %zu, sizeof( 'A' ) = %zun", sizeof( c ), sizeof( 'A' ) );
return 0;
}

其输出为

sizeof( "Hello" ) = 6
sizeof( char ) = 1, sizeof( 'A' ) = 4

请注意,类型char的值的范围取决于编译器选项,并且类型char可以表现为类型signed charunsigned char。所以写会更正确

char            1 byte     −128 to 127        %c
or
char            1 byte     0 to 255           %c

来自C标准(5.2.4.2.1整数类型的尺寸)

2如果char类型的对象的值被视为有符号在表达式中使用整数时,CHAR_MIN的值应为与SCHAR_MIN的值相同,CHAR_MAX的值应相同如SCHAR_ MAX。否则,CHAR_MIN的值应为0MAX的值应与UCHAR_ MAX的值相同。这个值UCHAR_MAX应等于2CHAR_BIT−1。

%c用于打印单个字符值,并期望其相应的参数具有类型char:

char c = 'A';
printf( "%cn", c );

%s用于打印字符串,这些字符串是包含零值终止符的字符值序列,并期望其相应的参数具有类型char *(指向char的指针),这是字符串的第一个字符的地址

char s[] = "hello"; // equivalent to {'h', 'e', 'l', 'l', 'o', 0}
printf( “%sn”, s ); // equivalent to passing &s[0]

除非它是sizeof或一元&运算符的操作数,或者是用于初始化声明中的字符数组的字符串文字,类型为"T的N元素数组"的表达式将转换("decay")为类型为"指向T的指针"的表达式"表达式的值将是数组第一个元素的地址。因此,当我们将表达式s传递给printf时,实际传递的是s[0]的地址,而不是数组内容本身。这基本上相当于写入

char s[] = "hello";
char *p = s;
while ( *p != 0 )
putchar( *p++ ); // print the character p points to, then advance
// p to point to the next character in the string

C中没有字符串类型,但C标准库确实将字符串定义为C11标准草案的空终止字符数组§7.1.1p1

字符串是以第一个null字符结尾并包含该字符的连续字符序列。

OP显示的表是正确的,charsigned charunsigned char都是1字节宽。本标准规定了类型的最小值范围,但没有规定绝对值范围;虽然表中的值范围是常见的,但它们并不能得到保证。特别地,char是值范围为0到255的无符号类型并不罕见。请注意,对于带符号的char类型,标准仅要求-127到127的最小范围。偶数字节必须具有最小8位宽度,但未指定恰好为8位。实际细节是实现细节。

CCD_ 41和CCD_;这些与类型没有直接关系,而是用于描述函数所期望的类型。对于fprintf()族函数,%c转换说明符告诉函数需要一个整数参数,该参数将转换为unsigned char值并打印为字符。请注意,字符编码不需要是ASCII(这是另一个实现细节),但这是目前最常见的。

%s转换说明符告诉fprintf()函数期望指向字符数组的第一个元素的指针。如果没有指定合适的精度(例如,%5s最多打印5个字符),则数组必须是字符串(即以null结尾)。

对于fscanf()族函数,%c指令告诉该函数扫描输入中的一个或多个字符(即,当提供字段宽度时不止一个字符,例如%3c),并期望指向足够大以保存结果的字符数组的指针。对于简单的scanf("%c", &some_char),要扫描的最大字符数是1,而some_char只需要是char,例如定义为char some_char;。但对于类似scanf("%5c", five_chars)的东西,five_chars必须是能够存储5个char的数组,例如定义为char five_chars[5];

%s指令对fscanf()函数的操作类似,但如果没有最大字段宽度规范,这将告诉fscanf()尝试匹配和存储字符,直到在输入中遇到空白。该函数需要一个指向能够容纳所有匹配字符(加上null终止符)的字符数组的指针,因此必须始终指定最大字段宽度,以避免潜在的缓冲区溢出。还要注意,%s指令总是导致在扫描最后一个字符后写入终止符。因此,当存储被声明为char storage[100];时,使用scanf("%99s", storage);是正确的。此操作会在写入最终的之前,告诉scanf()在输入中匹配最多99个字符,避免在大输入的情况下写入超过storage[]数组的末尾。

关于CCD_ 70和CCD_。请注意,fscanf()特别是一个复杂的函数,很难正确使用。

%s%c不是格式或类型。它们被称为"转换或格式说明符",用于printf()scanf()系列函数所使用的字符类型或字符串的正确格式设置。因此,它们本身没有"大小"或"范围"。


这两种格式的大小和范围有什么不同吗?

在C中,字符串本身不是一种类型。字符串是字符对象的连续序列。

字符串的"大小"在源代码中或程序运行时确定(可变长度数组);字符串没有一般的固定大小。

字符串与"范围"完全不同,因为它具有字符或整数类型。

你试图问所有这些字符加在一起是否能提供更大的范围。答案是否定的。

字符串中的所有字符在内存中都有自己的专用范围和大小,你不能将它们视为一种可以存储和表示更大值的化合物:

char a;      

a的大小为1字节,范围为-128到127或0到255(取决于实现和平台,但在大多数现代系统上,它的范围为-124到127)。

char b[4];

在这种情况下,b的大小为4字节,但其范围不是从-2147483648到2147483647(2³²=44294967296个可存储值(注意符号表示为一位))。它只由4个char对象组成,每个对象在内存中分配了1个字节,可以存储/表示−128到127/0到255的值。

如果要为单个字符使用更宽的范围,请使用宽字符类型wchar_t

最新更新