关于C语言字符解析有一种方法,词法分析“贪心法”,也叫”大嘴法“,编译器是将程序分解成符号的方法是,从左至右一个字符一个
字符的读入,如果该字符可能组成一个符号,那么在读入下一个符号,判断已经读入的两个字符组成的字符串是否可能是一个符号
的组成部分,如果可能继续读入,重复判断,知道读入的字符不再会使整个符号在有意义。 通俗的解释就是如果编译器的输入流截
止至某个字符之前都已经被分解为一个个的符号,那么下一个符号将包括从该字符之后可能组成一个符号的最长字符串。
自己感觉,上面所说的贪心法,就是对一长串字符进行词法分析的时候,总是从左到右,然后将整个字符串,分为独立的最大有意
、义的符号。例如说a---b,编译器就会认为是a--,-b,因为了第二个-的时候编译器就会认为--是最大的有意义符号。还有就是完
整的的符号中间如果有空格就会分开,使意义不完整,也就是说( )很重要,及时加(),可以避免很多错误。
1.单引号括起来的其实是一个整数,整数对应于该字符在编译器采用的字符集中的序列值例如采用ASCII字符集的编译器而
言,‘a’就是八进制的0141或者十进制的97。
2.被双引号引起来的字符串,代表的却是一个只想无名数组其实字符的指针,该数组被双引号之间的字符以及一个额外的二进制
为零的‘\0’初始化。
3.char类型的字符串末尾其实是以\0,或者0 来结尾的。
4.printf("hello world\n");和char a[] = { 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n',0};
其实是一个效果,strlen和sizeof分别求第二个长度为12,13,所以说strlen所求的必须是char* 类型的,且要以\0结尾。
5.切记单引号是整数,双引号是字符指针,现在的编译器一般都能检测出函数调用的时候,单引号和双引号混用的情形。
void(*post(int, void(*)(int)))(int);
为了清晰起见可以这样写
void(*post(int, void(*)(int)))(int);//一个函数声明
typedef void(*HEAS) (int); //表示HEAS是一个指向返回值是void类型,参数是int类型的指针
//HEAS就是void(*) (int)
//那么void(*post(int, void(*)(int)))(int);可以表示为
HEAS post(int, HEAS);
编写一个函数,对一个已经排好序的整数表进行二分查找,函数包含一个指向表头的头指针,表中的元素个数,以及待查找的数值。函数的输出是一个指向满足查找要求的元素指针,当未查找到满足要求的数值的时候返回一个nullptr指针
#include<iostream>
#include<string.h>
using namespace std;
int* test(int *a, int length, int find);
int main()
{
int a[] = { 1, 3, 4, 6, 7, 9, 10, 16, 18, 25, 33 };
int * p = a;
int *ret = test(a, sizeof(a) / sizeof(int),33);
if (ret == nullptr)
{
cout << "没有" << endl;
}
else
cout << "找到了 :"<<*ret << endl;
return 0;
}
int* test(int *a, int length, int find)
{
int *L = a;
int *R = (a + length-1);
int w;
int *middle = L;
while (*R >= *L)
{
w = (R - L) / 2;
cout << w << endl;
middle = (L + w);
cout << *L << " " << *middle << " " << *R << endl;
if (find > *middle)
{
L = middle+1;
}
else if (find < *middle)
{
R = middle-1;
}
else
{
return middle;
}
}
return nullptr;
}