做题的心得与经验(C/C++)

本文分享了C/C++编程中的一些实用技巧,包括保留小数、排序、字符串处理、全排列、数学运算等方面,同时也探讨了输入输出处理、数组与字符串操作、字符属性判断以及集合和链表等数据结构的使用方法。还提到了cin与getline的使用陷阱,以及如何避免。文章还涵盖了STL中set的用法,字符串转换,以及C++中的各种字符串操作和内存管理。

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

1. fixed << setprecision(2) //c++保留2位小数

 

2. sort(num,num+t) //自带排序函数,从小到大排 参数一首址 参数二 终址

 

3. 对9取余等于把那个数的每个数相加 在对 9 取余

 

4. 对10003 取余:num = (num * 10 + num_array[i] - '0') % 10003;

 

5. next_permutation(start,end),和prev_permutation(start,end) //全排列

 

6. pow(2,3) //2的3次方

 

7. reverse(que.begin(),que.end()); //数组倒置

 

8. getline(cin,str,jieshuweizhi)//接收带空格的字符串

 

9. cout.setf(ios::right); //设置对齐方式为右对齐

cout.fill('0'); //设置填充方式,不足位补0

cout.width(2); //设置宽度为2,只对下条输出有用

cout<<a<<endl;

 

10.sqrt(a); 开根号

 

11.我们先看下cin>>与getline的工作方式,流提取运算符根据它后面的变量类型读取数据,从非空白符号开始,遇到Enter、Space、Tab键时结束。getline函数从istream中读取一行数据,当遇到“\n”时结束返回。

getline(cin,str)的读取原理是将以‘/n’为结束符做为一完整读取的一行,'/n'会读。所以当之前用cin读取一个字符的时候,你会输入一个字符然后点击回车,那么下面getline(cin,str)读的时候会读入这个回车,

并判断结束了。

造成程序错误结果的原因是,用户输入完年龄后按回车结束输入,把“\n”留在了输入流里,而cin不会主动删除输入流内的换行符,这样换行符就被getline读取到,getline遇到换行符返回,因此程序不会等待用户输入。 

解决的办法是手动清除换行符,在cin>>后加上

cin.ignore();

 

12. setw(5); 设置域宽为5

 

13. memset(数组名,统一赋值参数, 赋值长度);

C/C++ 使用memset对数组进行整体赋值以及memcpy对 数组复制

 

14.gets(数组名) 获取包含空格在内的字符串

 

15.Ascii 0 - 255

 

16. 算法解题思路:对比两字符数组的 是否重叠 for(int i = 0; i < strlen(buf); i++)

if(strchr(s, buf[i]) == NULL) ok = 0;

sprintf(buf, "%d%d%d%d%d", abc, de, x, y, z); 将数存入字符数组

strchr的作用是在一个字符串中查找单

个字符,而这个sprintf似曾相识:之前用过printf和fprintf。没错!这3个函数是“亲兄

弟”,printf输出到屏幕,fprintf输出到文件,而sprintf输出到字符串

 

17.:由于字符串的本质是数组,它也不是“一等公民”,只能用strcpy(a, b),

strcmp(a, b), strcat(a, b)来执行“赋值”、“比较”和“连接”操作,

 

18."fgets(buf, maxn, fin)"将读取完整的一行放在字符数组buf中。应当保证

buf足够存放下文件的一行内容。除了在文件结束前没有遇到“\n”这种特殊情况外,buf总是

以“\n”结尾。当一个字符都没有读到时,fgets返回NULL。

和fgetc一样,fgets也有一个"标准输入版"gets。遗憾的是,gets和它的"兄弟"fgets差别比

较大:其用法是gets(s),没有指明读取的最大字符数。这里就出现了一个潜在的问题:gets

将不停地往s中存储内容,而不管是否存储得下!难道gets函数不去管s的可用空间有多少

吗?确实如此。

 

19.的isalpha、isdigit、isprint等工具可以用来判断字符

的属性,而toupper、tolower等工具可以用来转换大小写。如果ch是大写字母,则ch-'A'就是

它在字母表中的序号(A的序号是0,B的序号是1,依此类推);类似地,如果ch是数字,

则ch-'0'就是这个数字的数值本身。

 

20.

对于求生成元的问题,可以自己做成一个表

 

21. int less(const char* s, int p, int q) {

int n = strlen(s);

for(int i = 0; i < n; i++)

if(s[(p+i)%n] != s[(q+i)%n])

return s[(p+i)%n] < s[(q+i)%n];

return 0; //相等

}

int main() {

int T;

char s[maxn];

scanf("%d", &T);

while(T--) {

scanf("%s", s);

int ans = 0;

int n = strlen(s);

for(int i = 1; i < n; i++)

if(less(s, i, ans)) ans = i;

for(int i = 0; i < n; i++)

putchar(s[(i+ans)%n]);

putchar('\n');

}

return 0;

}

 

22 . STL set 集合用法:

set<string> s;

insert(key_value); 将key_value插入到set中 ,返回值是pair<set<int>::iterator,bool>,bool标志着插入是否成功,而 iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。

inset(first,second);将定位器first到second之间的元素插入到set中,返回值是void.

 

https://blog.youkuaiyun.com/byn12345/article/details/79523516

 

 

23. C/C++中没有提供直接获取数组长度的函数。对于存放字符串的字符数组,可用strlen函数获取长度。

 

24. 集合排序:https://www.cnblogs.com/zhouxiaosong/p/5557990.html

集合用法:https://www.cnblogs.com/mypsq/p/4348565.html

 

25. int 转 string string 转 int https://www.cnblogs.com/A-Little-Nut/p/8056421.html

int num = 101231;

stringstream ss;

ss << num;

ss >> str;

cout << str << " ";

ss.clear();

int num2;

string str2 = "1213";

ss << str2;

ss >> num2;

cout << num2 << endl;

return 0;

 

26. c/c++ string 输入获取空格 getline(cin,str);

 

27. 古风排序 问题出在 len 正好 整除 n 那时候则不需要+1 .。。。。。。。。。。。。。。。。。。。。。。。。。。。

 

28.  如果要比较的对象是两个string,则利用函数compare() 或者 == 

若要比较string s1和s2则写为:

s1.compare(s2)

  • 1

若返回值为0,则两者相等。

 

29. :把vector作为参数或者返回值时,应尽量改成用引用方式传递参数,以避 免不必要的值被复制。

 

30. 经典链表算法:

int n = strlen(s+1); //输入保存在s[1],s[2]...中

last = cur = 0;

next[0] = 0;

for(int i = 1; i <= n; i++) {

char ch = s[i];

if(ch == '[') cur = 0;

else if(ch == ']') cur = last;

else {

next[i] = next[cur];

next[cur] = i;

if(cur == last) last = i; //更新"最后一个字符"编号

cur = i; //移动光标

}

}

 

31.

string s1;//初始化字符串,空字符串 string s2 = s1; //拷贝初始化,深拷贝字符串 string s3 = "I am Yasuo"; //直接初始化,s3存了字符串 string s4(10, 'a'); //s4存的字符串是aaaaaaaaaa string s5(s4); //拷贝初始化,深拷贝字符串 string s6("I am Ali"); //直接初始化 string s7 = string(6, 'c'); //拷贝初始化,cccccc

 

string s1 = s2 + ", "; //正确 string s3 = "s " + ", "; //错误 string s4 = "hello" + ", " + s1; //错误 string s5 = s1 + "hello " + ", "; //改一下顺序,s1放前头,正确了,注意理解=号右边的运算顺序

 

string.find("pq", start);

 

32. https://www.cnblogs.com/skyfsm/p/6934246.html vector

vector<int> v1; vector<father> v2; vector<string> v3; vector<vector<int> >; //注意空格。这里相当于二维数组int a[n][n]; vector<int> v5 = { 1,2,3,4,5 }; //列表初始化,注意使用的是花括号 vector<string> v6 = { "hi","my","name","is","lee" }; vector<int> v7(5, -1); //初始化为-1,-1,-1,-1,-1。第一个参数是数目,第二个参数是要初始化的值 vector<string> v8(3, "hi"); vector<int> v9(10); //默认初始化为0 vector<int> v10(4); //默认初始化为空字符串

 

请使用push_back加入元素,并且这个元素是被加在数组尾部的。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值