size_t 与 unsigned, scanf()与getchar()
size_t 与 unsigned
size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。(unsigned 若省略后一个关键字,大多数编译器都会认为是 unsigned int)
在C++中,设计 size_t 就是为了适应多个平台的 。size_t的引入增强了程序在不同平台上的可移植性。size_t是针对系统定制的一种数据类型,一般是整型,因为C/C++标准只定义一最低的位数,而不是必需的固定位数。而且在内存里,对数的高位对齐存储还是低位对齐存储各系统都不一样。为了提高代码的可移植性,就有必要定义这样的数据类型。一般这种类型都会定义到它具体占几位内存等。当然,有些是编译器或系统已经给定义好的。经测试发现,在32位系统中size_t是4字节的,而在64位系统中,size_t是8字节的,这样利用该类型可以增强程序的可移植性。
它是一种“整型”类型,里面保存的是一个整数,就像int, long那样。这种整数用来记录一个大小(size)。size_t的全称应该是size type,就是说“一种用来记录大小的数据类型”。通常我们用sizeof(XXX)操作,这个操作所得到的结果就是size_t类型。因为size_t类型的数据其实是保存了一个整数,所以它也可以做加减乘除,也可以转化为int并赋值给int类型的变量。
类似的还有wchar_t, ptrdiff_t。wchar_t就是wide char type,“一种用来记录一个宽字符的数据类型”。ptrdiff_t就是pointer difference type,“一种用来记录两个指针之间的距离的数据类型”。通常,size_t和ptrdiff_t都是用typedef来实现的。你可能在某个头文件里面找到类似的语句:
typedef unsigned int size_t;
typedef int ptrdiff_t;
而wchar_t则稍有不同。在一些旧的编译器中,wchar_t也可能是用typedef来实现,但是新的标准中wchar_t已经是C/C++语言的关键字,wchar_t类型的地位已经和char, int的地位等同了。在标准C/C++的语法中,只有int float char bool等基本的数据类型,至于size_t,或size_type都是以后的编程人员为了方便记忆所定义的一些便于理解的由基本数据类型的变体类型。
例如:typedef int size_t;定义了size_t为整型
scnaf() 与 getchar()
scanf 函数怎样跳过空格字符?
为了强制 scanf 函数在读入字符前跳过空白字符,需要在格式串转换说明 %c 前面加上一个空格:
char ch;
scanf(" %c", &ch); // skips white space, then reads ch
// getchar(), putchar() 函数用法
char ch1;
ch1 = getchar();
putchar(ch1);
// 惯用法。
while (getchar() != '\n') // skips rest of line
;
// 惯用法
while ((ch = getchar()) == ' ') // skips blanks
;
当循环终止时,变量 ch 将包含 getchar 函数遇到的第一个非空字符 // 思考
如果 scanf 和 getchar 混合使用的时候,请注意了:
printf("Enter an integer: ");
scanf("%d", &i);
printf("Enter a command: ");
command = getchar();
在读入 i 的同时,scanf 函数调用将会留下后面没有消耗掉的任意字符,包括换行符(但不仅限于换行符)。getchar 函数随后将取回第一个剩余字符,但这个不是我们所希望的结果。
#include <stdio.h> int main() { int i; char ch, command; printf("Enter an integer: "); scanf("%d", &i); printf("%d\n",i); // 这个用法,有其存在的必要性 while ((ch = getchar()) != '\n') // skip rest of line ; printf("Enter a command: "); command = getchar(); printf("%c\n",command); // printf("Enter a command: "); // scanf("%c", &command); // printf("%c\n", command); return 0; }
仔细体会这段代码。不要钻牛角尖。不深入讨论。