在互联网上,我发现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 char
或unsigned 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显示的表是正确的,char
、signed char
和unsigned 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
指令总是导致在扫描最后一个字符后写入