C
循环的执行顺序
for(条件①;条件②;条件③){
循环体④
}
执行顺序如下:
①②④③ ②④③ ②④③… …直到结束
scanf其他用法
scanf函数遇到 TAB
⋃ 空格
⋃ \n
的时候视为输入结束
%[^\n]
的意思是“遇到换行才结束”,那样,在我们输入空格的时候,scanf就不用自动终止读取了,直到我们按下回车换行
eg:
#include<stdio.h>
int main()
{
char a[50];
scanf("%s", a);
printf("%s", a);
return 0;
}
#include<stdio.h>
int main()
{
char a[50];
scanf("%[^\n]", a);
printf("%s", a);
return 0;
}
strcmp()函数的用法
首先要引用头文件:string.h
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "Apple", str2[] = "Banana";
int t = strcmp(str1, str2);
printf("%d", t);
return 0;
}
str1<str2,故t=-1(负数)
若str1>str2,则t=1(正数);若相等,则t=0
两个字符串自左向右逐个字符相比(按 ASCII 值大小相比较),直到出现不同的字符或遇 \0 为止。如:
1."A"<"B"
2."A"<"AB"
3."Apple"<"Banana"
4."A"<"a"
5."compare"<"computer"
字符串的输入和输出
在C语言中,有两个函数可以在控制台(显示器)上输出字符串,它们分别是:
- puts():输出字符串并自动换行,该函数只能输出字符串
- printf():通过格式控制符
%s
输出字符串,不能自动换行。除了字符串,printf() 还能输出其他类型的数据
注意,输出字符串时只需要给出名字,不能带后边的[ ]
,例如,下面的两种写法都是错误的:
printf("%s\n", str[]);
puts(str[10]);
gets():直接输入字符串,并且只能输入字符串
scanf() 和 gets() 是有区别的:
- scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串
- gets() 认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束,所以,不管输入了多少个空格,只要不按下回车键,对 gets() 来说就是一个完整的字符串。换句话说,gets() 用来读取一整行字符串
数组或者字符串用于 scanf() 时不用添加&
,它们本身就会转换为地址
异或(^)
基本概念
符号
异或是一种二进制的位运算,符号以 XOR 或 ^ 表示
运算规则
相同为0,不同为1,即
1 ^ 1 = 0
0 ^ 0 = 0
1 ^ 0 = 1
由运算规则可知,任何二进制数与零异或,都会等于其本身,即 A ^ 0 = A
异或性质
(1)交换律: A ^ B = B ^ A
(2)结合律: ( A ^ B ) ^ C = A ^ ( B ^ C )
(3)自反性: A ^ B ^ B = A (由结合律可推: A ^ B ^ B = A ^ ( B ^ B ) = A ^ 0 = A)(B ^ B =0)
异或应用
变量交换
示例:将 a 和 b 两个变量值交换,例如: a = 3,b = 7,交换后,a = 7,b = 3
// 常规方法
int temp = a; // temp = 3
a = b; // a = 7
b = temp; // b = 3
// 异或方法
a = a ^ b; // a = 3 ^ 7
b = a ^ b; // b = (3 ^ 7) ^ 7 = 3 ^ (7 ^ 7) = 3
a = a ^ b; // a = (3 ^ 7) ^ (3 ^ 7 ^ 7) = (3 ^ 3) ^ (7 ^ 7) ^ 7 = 7
排除偶次重复
示例:在一个整数数组中,仅存在一个不重复的数字,其余数字均出现两次(或偶数次),找出不重复数字。
// 常规方法:通过二次循环找出不重复的数字
for (...) {
for (...) {
...
}
}
// 异或方法:将所有整数异或,出现偶数次的整数会被抵消,最终留下不重复整数。
int result = 0;
for (int index = 0; index < numArray.length; index++) {
result = result ^ numArray[index];
}
return result;
按位与、按位或、按位取反
按位与
1&1=1;1&0=0;0&0=0
按位或
1|1=1;1|0=1;0|0=0
按位取反
~11100=00011
对所有整数取反=本身的相反数-1 取反前后 两数相加为负一
指针
(7条消息) 两个数字的交换(指针的使用)_Owen1172920954的博客-优快云博客
C++
关于输出的函数
在C++中 以下函数可互用:
setw()或cout.width()
setfill()或cout.fill()
setprecision()或cout.precision()
其中前面的set… ()需要头文件 #include
cout.width():
a、cout.width()将显示当前的字段宽度,默认为0,而cout.width(3)将把字段宽度设定为3
注意C++容纳字段的方式为给字段分配刚好合适的宽度来容纳字段,所以C++中默认的字段宽度为0,以适合于所有的字段
b、width的默认对齐方式为右对齐,即如果cout.width(12)如果字段没有这么宽,则将在字段的左边填以空格来达到12个字段的宽度。
c、还要注意的是width只影响他设置后的下一个输出,再下一个字段输出后,后继的字段被恢复为默认值,比如cout.width(12); cout<<2<<3;则输出2时会以12字段的宽度显示,但显示3时就会以默认的方式显示了
d、int width()调用他时将会反回上一次的字段宽度的值
cout.fill():
成员函数fill()可以用来改变填充的字符,比如cout.fill(‘’),使用填充空白部分
但是千万要注意:fill函数在设置后将一直有效,除非被重新设定。这一点与width()十分不同。width只影响他设置后的下一个输出,再下一个字段输出后,后继的字段被恢复为默认值0
而且cout.fill(’ ‘)会返回设置’ ‘之前的fill字符’ ‘,所以如果用cout<<cout.fill(’*’)就会输出这个空格