1.当 scanf(); 遇到 Tab 空格 换行 出错时, scanf(); 会认为用户输入结束。
2.字符数组里面最后一个为转义字符中的空字符,为不可见字符。
char s[100];
gets(&s[0]); get(s); 两者的效果是一样的。 gets可以获取字符串。
数组名是数组第一个元素的地址。因此 &s[0] 取第一个元素的地址,与数组名s 所代表的地址一样。
3.数组允许整体初始化,但不允许整体赋值。
4.排序的目的就是为了查找:
利用二分法查找。算法复杂度为log2^n
二分法,查找一个数时会先在此数组中找中间的一个数值进行比较,判断出要找的数与中间的数值大小,进而可以排除掉一半的数,
不必去一一比对。此算法面对的数据量越大,它的效率越高。
int main(void)
{
int a[] = {1,2,3,4,5,6,7,8,9};
int len = sizeof(a) / sizeof(a[0]); //取数组的长度
int n;
scanf("%d", &n);
int i,beg,end; //用变量来标识数组的头尾
int mid;
i = 0;
end = len - 1; //数组用下标访问时,要成员个数减一。
beg = i;
while(beg <= end)
{
mid = (beg + end) / 2;
if(a[mid] > n)
{
end = mid - 1;
}
else if(a[mid] < n)
{
beg = mid + 1;
}
else
{
break;
}
}
printf(beg <= end ? "found\n" : "not found\n"); //此操作有些炫,第一次没有想到。
/* if(beg <= end)
{
printf(“yes %d\n”, a[mid]);
}*/
return 0;
}
5.数组的容量是数组最大限度可以装多少东西。
***将数组中的小写字母变为大写字母:
int main(void)
{
int i = 0;
char s[100] = “hello”;
while(s[i] != ‘\0’) //根据数组所存元素最后一个为 ‘\0’ 的特性,可以将数组的元素都遍历一遍,而不需要 for循环。
{
if(s[i] >= ‘a’ && s[i] <= ‘z’) //此处可以直接写单个字符进行判断,
{
s[i] = s[i] - 32; //小写字母与大写字母相差32
}
++i;
}
i = 0;
/* while(s[i] != ‘\0’)
{
putchar(s[i]);
++i;
}*/
while(s[i]) //此处相当于优化
{
putchar(s[i++]);
}
printf("\n");
return 0;
}
***用putchar将数组中的字符串打印出来,putchar一次只可以打印一个字符。
此处利用数组与 while()语句的特性来编写。
int main(void)
{
int i = 0;
char s[] = “hello”;
while(s[i])
{
putchar(s[i++]);
}
putchar(’\n’);
}
***计算数组中有效字符的个数,小写字母a 到 z ,大写字母A 到 Z
int main(void)
{
int i = 0;
int counter = 0;
char s[] = “Hello World!”;
while(s[i])
{
if(s[i] >= ‘a’ && s[i] <= ‘z’ || s[i] >= ‘A’ && s[i] <= ‘Z’)
{
++i;
++counter;
}
}
}
printf("%d\n", counter);
return 0;
}
***将数组s1中的字符,
int main(void)
{
char s1[100] = “hello world!”;
char s2[100];
int i = 0;
int j = 0;
while(s1[i++])
{
s2[i] = s1[i];
}
s2[i] = '\0';
puts(s2);
}
6.系统头文件中包含的库函数,平时开发时都是调用的,但一些简单的库函数,可以自己去实现下,
如:(1)strlen(); 函数可以得到数组的有效长度。
(2)strcpy(); 函数可以拷贝一个数组中的元素到另一个数组。
(3)strcat(); 函数可以把一个数组,连接到另一个数组的后面。
(4)strcmp(); 函数可以比较两个数组,谁比较大一些。
在调用库函数时,库函数返回的结果应该用 > 0 , 0 < 或 == 0,来判断。
char* strcpy(char* dest, const char* src);
char* dest; 只能传数组, const char* src; 可以传数组也可以传常量。
***实现strlen(); 的效果
int main(void)
{
int i = 0;
int counter = 0;
char s[] = “Hello World!”;
while(s[i])
{
if(s[i] >= ‘a’ && s[i] <= ‘z’ || s[i] >= ‘A’ && s[i] <= ‘Z’)
{
++i;
++counter;
}
}
}
printf("%d\n", counter);
}
***实现strcpy();的效果
int main(void)
{
char s1[100] = “hello world!”;
char s2[100];
int i = 0;
int j = 0;
while(s1[i])
{
s2[i] = s1[i];
++i;
}
/while(s1[++i]) //i++
{
s2[i] = s1[i];
}/
//此处数组s2是没有赋初值的,如果在while()中 ++i 或者i++ 的话,给s2拷贝的时候,相当于跳过了第一个值的位置s2[0]
//此处的解决办法是,给s2赋一个初值也行,这样相当于找到头了,就可以根据首地址来找到后面的字符,不然会飞掉。
//也可以将循环中的下标减一,达到效果。 s2[i - 1] = s1[i - 1];
s2[i] = ‘\0’;
puts(s2);
return 0;
}
***实现strcat();的效果
分析:找到s1的末尾,将s2从头取出来加到s1的末尾连接起来,最后面再加 ‘\0’
int main(void)
{
char s1[100] = "World";
char s2[100] = "hello";
int i = 0, j = 0;
while(s1[i])
{
++i;
}
while(s2[j])
{
s1[i++] = s2[j++];
++i;
++j;
}
//strcat(s1,s2);
s1[i] = ‘\0’;
puts(s1);
return 0;
}
*** 用strcpy函数完成三个字符数组的比较:
int main(void)
{
char s1[100] = “hello”;
char s2[100] = “world”;
char s3[100] = “c language”;
char max[100];
char max1[100];
if(strcmp(s1,s2) > 0)
{
strcpy(max,s1);
}
else if(strcpy(s1,s2) < 0)
{
strcpy(max,s2);
}
if(strcmp(max,s3))
{
strcpy(max1,max);
}
else
{
strcpy(max1,s3);
}
puts(max1);
return 0;
}
***实现strcmp的效果:
分析: 比较两个数组,谁比较大时,从头开始将两个数组的字符拿出来一一比较,其实也就是比较两个字符ASCII码的大小。
int main(void)
{
char s1[100] = “hello”;
char s2[100] = “world”;
int i = 0;
while(s1[i] != ‘\0’ && s2[i] != ‘\0’ && s1[i] == s2[i])
{
++i;
}
int j = s1[i] - s2[i];
if(j > 0)
{
puts(s1);
}
else if(j < 0)
{
puts(s2);
}
else
{
printf("equel");
}
}
***模拟实现printf(); 语句的功能。 输入一个整型变量,将变量按照字符的形式打印出来;
int main(void)
{
int n = 123456789;
char s[100];
int i = 0;
while(n)
{
s[i] = n % 10 + 48;
n = n / 10;
++i;
}
puts(s);
s[i] = '\0';
puts(s);
int j;
int l = strlen(s) / 2;
for(j = 0; j <= l - 1; ++j) //此处将储存到数组中的数字按字符打印出来
{
char t = s[j];
s[j] = s[l - j - 1];
s[l - j - 1] = t;
}
puts(s);
return 0;
}
下面的程序对于负数同样适用,注释的语句为编写时候的测试语句,此方法虽然笨重但还是有些逻辑思考的:
int main(void)
{
int n = -123456789;
char s[100];
int i = 0;
int h = 0;
// int m = sizeof(n) / 4;
while(n) //将整型变量的位数计算出来
{
n = n / 10;
++h;
}
printf("%d\n", h);
n = -123456789;
while(n)
{
if(n <= 0)
{
int k;
s[i] = 45;
puts(s);
++i;
for(k = 0; k < h; ++k)
{
//printf("nei ceng %d\n", i);
s[i] = n / -1 % 10 + 48;
//printf("%d\n", s[i]);
n /= 10;
//printf("%d\n", n);
++i;
}
}
else
{
s[i] = n % 10 + 48;
n = n / 10;
}
}
s[i] = '\0';
//printf(“w= %d\n”, s[i]);
puts(s);
int j;
int l = strlen(s);
for(j = 1; j <= l / 2; ++j)
{
char t = s[j]; //此处要注意些
s[j] = s[l - j];
s[l - j] = t;
}
puts(s);
return 0;
}