-
while
如果要判断一个相等的条件,就用==
; -
char *s = “xxxx”
和char s[] = "xxx"
是有区别的,后者,在函数进行参数传递时,可以用s[i]
;而前者不能用,会出现报错使用未分配的空间。 -
#include<string.h>
中的strlen
函数,所求的长度不包含'\0'
;而sizeof
所求的长度则包含'\0'
;所以sizeof
所求的长度比strlen
所求的长度多1。 -
打印字符串时,采用的时
%s
可直接把字符串打印出来(以\0
作为结尾)。 -
字符串的输入:
//当要输入一个不知道长度的字符串或者数字时,采用此方法。 char str[100]; scanf ("%s",str); //采用%s直接输入字符串,并且str直接表示地址。 int l = strlen (str); //算出字符串的长度。 int sum = 0; for (int i = 0;i < l; i++){ //计算各个位数的和 sum = sum + str[i] - '0'; //把字符型格式转换为整数型。 “ - '0' ” } “ + '0'” 是转换为字符
-
字符串进行传递:
int strStr(char* haystack, char* needle) { //如第二条所说,可以使用haystack[i]和needle[i] } int main (){ char haystack[] = "sleetcode"; //字符串用“” 字符用‘’ char needle[] = "co"; printf ("%d",strStr(haystack,needle)) return 0; }
-
输入带有空格的数字串
while (1){ scanf ("%d",&A[num]); num ++; char c = getchar(); //获取键盘的输入 if (c == '\n'){ break; }//if }//while
-
输入带有空格的字符串
char str[1000]; scanf ("%[^n]",str); //"%[]"表示的含义 //或者可以用 gets(str); scanf ("%[^]]",str); //表示当输入到]时停止输入,如果没有加^则表示只输入【】内有的,如果碰到没有的就结束输入。 //gets下运用strlen int len = strlen(str); for (int i = 0;i <= len;i++){ //这样才能遍历数组,一定要注意有=!!! }
-
交换两个变量的值(结构体也是同样的操作)
void swap (int *a,int *b){ int temp; temp = *a; *a = *b; *b = temp; } int main (){ int a,b; swap (&a,&b); return 0; }
-
c语言结构体可以直接交换
typedef struct student { long id; int dgrade; //德分 int cgrade; //才分 int all; //总分 } student; void swap(student s[], int i, int j) { student a; a = s[i]; s[i] = s[j]; s[j] = a; }
-
注意格式
#define N 10000
; 保留两位小数printf("%.2f",N)
-
c语言用
->
或者.
的区别:在C语言中,"->“用于访问指向结构体的指针变量的成员,而”."用于访问结构体变量的成员。具体来说,当你有一个指向结构体的指针时,可以使用"->"来访问该结构体的成员。例如:
cstruct Person { char name[20]; int age; }; struct Person p1; struct Person *ptr = &p1; ptr->age = 30;
在上面的例子中,我们定义了一个结构体Person和一个指向Person结构体的指针ptr,然后使用"->"来给age成员赋值。
而当你直接使用结构体变量而不是指针时,应该使用"."来访问结构体的成员。例如:
cstruct Person p2; p2.age = 25;
总的来说,当需要通过指针访问结构体成员时,应该使用"->“;当直接操作结构体变量时,应该使用”."。
-
c语言函数传递地址的方法
//定义栈 typedef struct { int a[max]; int tag; int size; } Stack; //初始化栈 void Init_Stack(Stack *S) { //根据上条,指针要用-> S->tag = -1; S->size = 0; } int main() { Stack S; Init_Stack (&S); //注意调用方式 } //在c++的情况下进行函数的参数传递,如果需要返回,则加上&; #include <bits/stdc++.h> #define max 100 using namespace std; //定义栈 typedef struct { int a[max]; int tag; int size; } Stack; //初始化栈 void Init_Stack(Stack &S) { //根据上条,指针要用-> S.tag = -1; S.size = 0; } int main() { Stack S; Init_Stack (S); //注意调用方式 cout << S.size << " " << S.tag << endl; }
-
c语言保留小数和前面自动补零的操作
printf ("%.2f",a);//结果保留两位小数,且可以四舍五入 printf ("%02d",a);//结果两位,如果不够两位整数则自动在数字前补0 printf ("%08.4f",a);//表示打印出小数点后一共4位,且共8位(包括小数点),不够8位则用0填充
-
c语言的按照格式输入
scanf ("%d/%d/%d",&a,&b,&c); //是按照xxx/xxx/xxx的格式进行输入
-
c语言字符的ASCII码
A~Z:65~90;a~z:97~122.
//不用硬记,直接可以输出 printf ("%d",'a'); //输出97 char a = 'a'; char s = a - 32; // 小写转换为大写字母减去32 int s = a - 32;//表示整数 97-32 = 65; char s = 65; //表示ascii为23的字符 printf ("%c",s); //这样会输出A printf ("%d",s); //这样会输出65 s = 6 + '0';//表示字符“6” 注意:这里采用的是字符型,所以两位数如“65” 会发生错误,因为s只能存贮一个字符 printf ("%c",s); //这样会输出6 printf ("%d",s); //这样会输出54
-
已知一个字母的ASCII码,来转换为字母
int ascii; char s = (char)ascii; //强制类型转换 printf ("%c",s);
-
c语言有关字符串的比较和赋值
#include <string.h> //str1 = str2 则返回0,str1 > str2 则返回大于0的值,str1 < str2 则返回小于0的值 int strncmp(const char* str1, const char* str2, size_t num); //strcmp 和 strncmp的区别在于,前者可以指定比较位数,而后者不能指明位数,但是可以采用改变送入的指针而进行比较后几位 int strcmp(const char* str1, const char* str2) //以下为例子 int main (){ char s[6] = {"asdfgd"}; char str[6] = {"asdasd"}; int a1 = strcmp(s,str);//比较s和str是否相等 int a2 = strcmp(&s[3],&str[3]);//比较s和str的后3位是否相等 int a3 = strncmp(s,str,3)//比较s和str的前3位是否相等 strncpy(s,str,3);//复制前3位 把str复制到s中 strcpy(s,str); //全部复制 return 0; } #include <string.h> //前面的为复制到的目的数组,后面为被复制的数组 char *strncpy(char *dest, const char *src, size_t n) //赋值前n位 char *strcpy(char *dest, const char *src) //全部赋值
-
c语言在进行小数输入时,应该尽量使用double,不用float,因为double更加的精准。
double d; scanf ("%lf",&d); printf ("%f",d);
-
当输入一串字符,切当输入“换行”时结束,可以词用如下方式:
char c,str[100]; for (int i = 0;(c = getchar ()) != '\n');){ scanf ("%s",str); } //下面为进阶版本,输入要求:三行数据,每一行任意长度,并且只取输入[x]中的x为有效值,并且每个x大小不一样,为字符串 char str[3][10][5] = {'\0'}; //表示字符为空,可以用 *(str[i][j]) != '\0',来判断是否为空 int num[3] = {0}; //用来纪律每行为多少元素 char c; for (int i = 0; i < 3; i++) { for (int j = 0; (c = getchar()) != '\n';) { if (c == '[') { //当输入有'['时,开始输入 scanf("%[^]]", str[i][j++]); //'^]'表示输入到直到碰到]结束 num[i]++; //用来记录每一行多少个元素 } } }
-
atof()
把字符串数组,转换为双精度浮点数(double)。在stdlib.h
函数库里 -
pat 1058 选择题 的输入问题,可以复习查看,复杂情况的输入。
-
字符串的比较:
#include <string.h> //逐个字符进行比较 int strcmp(char *str1,char *str2);//如果一样就返回0;str1>str2就返回1;否则返回-1 #include <malloc.h> //注意添加头文件 LList *L = (LList*)malloc(sizeof (LList));
-
c语言生成随机数
#include <stdlib.h> #include <time.h> int main (){ int a; srand((unsigned)time(NULL)); //作为种子 a = rand(); //生成随机数 return 0; }
-
c语言二维数组初始化赋值时:
int a[100][100] = {0}; //只有0时,可以这样初始化,表示所有的元素都是0 a[100][100] = {99}; //只表示a[0][0] 为99,其他元素全部为0; //赋值只能采用双重循环
-
c语言的小细节
scanf ("%d",&n); gets(s); //这样的话,会直接结束,因为scanf 是不读取回车的,然而gets是碰到回车就结束的。 //解决方案就是在scanf 后面加上一个getchar()用来抵消掉空格 //long long 的使用 int 的范围在-1e9到1e9,long long的范围-1e18到1e18 long long x; scanf ("%lld",&x); printf ("%lld",x);
-
c++的语法,很多时间可以相互使用文件后缀为 xxx.cpp
include <bits/stdc++.h> using namespace std; //cin 和 cout的使用 string a,b; cin >> a >> b; a = a+b; cout << "a + b 之后的值" << a; //输入二位字符数组时,不要用%c一个一个的输入,因为回车也算是一个字符,会发生错误 //正确输入: for (int i = 0;i < n;i++){ scanf ("%s",str[i]) } //采用sort函数进行排序 int a[10]; sort (a,a+10);//默认是从小到大排序,第一个参数为第一个数的起始地址,第二个参数为最后一个数的地址+1 //__gcd 的用法 gcd是求最大公约数,最小公倍数为lcm = a*b / (最大公约数) 用gcd的时候记得加上两个 _
-
c++的map函数
//map用来映射 map <string,int> dict; //目录为string类型(字符串),而输出为int类型整形,而此映射的名字为M; dict["Tom"] = 1; dict["Jack"] = 2; if (dict.count("Tom") != M.end()){ count >> "Tom": >> dict.count; }
例题:
#include <bits/stdc++.h>
using namespace std;
typedef struct student {
string id;
string name;
string sex;
int year;
}student;
int main (){
int n;
cin >> n;
map <string,student> M;
for (int i =0 ;i<n;i++){
student s;
cin >> s.id >> s.name>>s.sex>>s.year;
M[s.id] = s;
}
int m;
cin >> m;
for (int i = 0;i < m;i++){
string ha;
cin >> ha;
if ((M.find(ha))!= M.end()){
cout << M[ha].id << " " << M[ha].name << " " << M[ha].sex << " "<< M[ha].year;
}
}
return 0;
}
-
在c++中求字符的长度应该为
string str; cin >> str; int leng = str.length(); //用来求string的长度,char的长度还是用strlen求。 //使用map的计数功能时,如果计数要变动时,直接使用M[x] 即可,不需要使用count,这样会引起错误,无限循环。 map <char,int> M; M[str[i]] ++; while (M[str[i]] > 0){ cout << str[i]; M[str[i]] --; }
-
判断两个字符串是否相等有如下集中情况
string a; char b[10]; //要判断a和b是否相等 if (strcmp (b,a.c_str()) == 0){ //要用.c_str(),转换为str类型 .... } string a,b; //判断string类型的直接进行比就可以了 if(a == b){ .... }
-
c++ 报错:
[Error] reference to 'count' is ambiguous
时,修改变量的名称,因为可能函数模块已经有这个变量的名称了。 -
递归实现,带有回溯的经典例题:
用递归实现,显示用1分、2分和5分的硬币凑成1元,一共有多少种方法。
#include <bits/stdc++.h> using namespace std; int str[3] = {5,2,1}; int cont = 0; void func (int sum,int n,int k){ if (sum > n){ return; } else if (sum == n){ cont ++; return; } else { for (int i = k;i < 3;i++){ sum = sum + str[i]; func (sum,100,i); sum = sum - str[i]; } } } int main (){ cont = 0; func (0,100,0); cout << cont << endl; }
-
sums问题:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4]
满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]解题思路:先对数组进行排序,然后采用三个指针,low,mid,high。每次当low和mid定的时候,这次输出的三元组就一定唯一,所以每次low和mid更新时,都要检查,是否和前一个元素相同。如果相同,则输出的三元组一定重复。所以,low和mid进入循环时,应该检查不能和前面一个low-1和mid-1相同,当然第一个0和mid 的初始化(mid = low + 1)不用检查和前面的元素。
cont = 0;
func (0,100,0);
cout << cont << endl;
} -
sums问题:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4]
满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]解题思路:先对数组进行排序,然后采用三个指针,low,mid,high。每次当low和mid定的时候,这次输出的三元组就一定唯一,所以每次low和mid更新时,都要检查,是否和前一个元素相同。如果相同,则输出的三元组一定重复。所以,low和mid进入循环时,应该检查不能和前面一个low-1和mid-1相同,当然第一个0和mid 的初始化(mid = low + 1)不用检查和前面的元素。