C语言的一些基础知识

本文详细讲解了C语言中的for循环执行顺序,介绍了scanf特殊用法,包括遇到空格和换行的处理,以及strcmp函数的字符串比较。此外,还涵盖了字符串输入输出、异或运算、位操作及指针在交换变量中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(’*’)就会输出这个空格

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值