当前位置:   article > 正文

C++错误总结_虚幻新建的代码文件是gb2312格式的

虚幻新建的代码文件是gb2312格式的
1常见错误总结

错误 1:VS 的中文乱码问题

 VS 最知名的错误(被程序员吐槽最多的 BUG)。 VS 支持多种中文编码,但是使用不当时,常常导致中文乱码,而且难以解决。

中文乱码的原因: 1. 中文在不同编码格式下, 存储的方式不一样.

                      2. 如果程序是 A编码方式编译运行的,但是控制台却是以 B 编码方式来显示, 就会出            现乱码.       

                 3. vs 的控制台默认编码是 GB2312,编号号是 836

注意:GBK 编码是兼容 GB2312 的,一 般描述 GBK 常常就是指 BG2312 如果源代码文件的编码如果是其他编码格式, 就会导致中文乱码

正常场景: 在 vs 中新建文件时,该文件默认都是 GB2312 编码. 因为控制台默认也是 GB2312 编码,所以一般情况下,都不会出现中文乱。

错误场景: 1. 直接在项目中导入了其他已经创建好的源代码文件, 如果该文件不是 BG2312 编码, 而且含有中文的话, 就必定会出现中文乱码.

2. 从其他文件中复制代码到 vs 的文件中, 也可能导致编码错乱.

3. 网络编程中, 和服务器交互通信, 两端的编码很可能不同. 我们的”黑客攻击系统”的服务端木马, 就是 UTF-8 编码格式的

解决方案: 修改文件的编码 修改源代码文件的”编码格式”, 使其和控制台的编码格式保持一致. 代码文件的编码格式,可以通过 vs 很方便的修改: 先用 vs 打开对应的文件, 然后如下操作:先设置控制台的编码

错误 2:360 报告病毒

错误 3:代码正确,但是无法通过编译

代码看不出错误,而且报错信息莫名其妙,则很可能是因为代码使用全角字符方式输入的。 特别是各种符号,比如双引号,圆括号,分号等。

解决方案:重新输入,安装搜狗输入法,设置中文时使用英文标点输入。

2.常见错误总结

输入数据时,前面的数据输入错误,导致后面的数据都不能输入

解决方法

3.错误总结

cin.sync()在 VS 中失效!

C++的标准中, cin.sync()是清空缓冲区,但是实际的实现取决于编译器. 如果使用 vc++或者 g++编译器,是可以的, 但是使用 vs 中的编译器,就不可以,需要使用自定义的clearBuff();

  1. #include <iostream>
  2. #include <Windows.h>
  3. #include <stdio.h>
  4. using namespace std;
  5. void clearBuff() {
  6. char tmp;
  7. while ((tmp = getchar()) != '\n');
  8. }
  9. int main(void) {
  10. int age = 0;
  11. int height = 0; //身高, 单位:cm
  12. cout << "请输入年龄: " << endl;
  13. cin >> age;
  14. if (cin.fail()) {
  15. cout << "输入失败,应该输入一个整数" << endl;
  16. cin.clear();
  17. //cin.sync();
  18. clearBuff();
  19. }
  20. cout << "请输入身高: " << endl;
  21. cin >> height;
  22. cout << "年龄: " << age << endl;
  23. cout << "身高:" << height << endl;
  24. system("pause");
  25. return 0;
  26. }
4.错误总结

1.switch 错误

以下错误,在 vs/vc 中有提示,但是仍可以通过编译。 在 gcc 编译器中,不能通过

  1. #include <stdio.h>
  2. int main(void) {
  3. int c;
  4. scanf("%d", &c);
  5. switch(c) {
  6. case 1:
  7. int x = 0; //错误!
  8. printf("c=1");
  9. break;
  10. case 2:
  11. printf("c=2");
  12. break;
  13. default:
  14. printf("other");
  15. break;
  16. }
  17. return 0;
  18. }

应该改为:

  1. #include <stdio.h>
  2. int main(void) {
  3. int c;
  4. scanf("%d", &c);
  5. switch(c) {
  6. case 1:
  7. {
  8. int x = 0; //错误!
  9. printf("c=1");
  10. }
  11. break;
  12. case 2:
  13. printf("c=2");
  14. break;
  15. default:
  16. printf("other");
  17. break;
  18. }
  19. return 0;
  20. }

不安全函数(scanf等)

  1. #include <iostream>
  2. #include <string>
  3. #include <stdio.h>
  4. using namespace std;
  5. int main(void)
  6. {
  7. int num;
  8. scanf("%d", &num);
  9. system("pause");
  10. return 0;
  11. }

vs 中不能直接使用 scanf 等 C 标准库函数 因为 vs 使用更安全的 c11 标准, 认为这类函数不安全。   

注明,这类函数正常使用时,是没有任何问题的 但是,部分黑客可能会利用其中的缺陷,开发恶意软件,对系统造成影响

解决方案: 1. 方法 1:使用修改项目的属性,直接使用这些“不安全”的函数。 添加: /D _CRT_SECURE_NO_WARNINGS

2. 方法 2:使用 c11 标准中的“更安全”的函数 scanf_s

gets 不能使用 使用 gets_s gets 是老标准 C 语言函数,vs 使用更安全的 c11 标准, 使用对应的 gets_s

char line[32];

gets_s(line, sizeof(line));

scanf 不能使用 原因同上,改用 scanf_s

  1. int x;
  2. scanf_s("%d", &x); //不需要使用第 3 个参数,用法和 scanf 相同
  3. float f;
  4. scanf_s("%f", &f); //不需要使用第 3 个参数, 用法和 scanf 相同
  5. char c;
  6. scanf_s("%c", &c, sizeof(c)); //需要使用第 3 个参数, 否则有告警
  7. char name[16];
  8. scanf_s("%s", name, sizeof(name)); //需要使用第 3 个参数
  9. int age;
  10. char name[16];
  11. scanf_s("%d%s", &age, name, sizeof(name));

cin >> 的返回值

  1. #include <iostream>
  2. #include <string>
  3. #include <Windows.h>
  4. using namespace std;
  5. int main(void) {
  6. string word;
  7. int count = 0;
  8. int length = 0; cout << "请输入任意多个单词:"; while (1) {
  9. if ((cin >> word) == 0) { //在 vs 中不能通过编译
  10. break;
  11. }
  12. count++;
  13. length += word.length();
  14. }
  15. cout << "一共有" << count << "单词" << endl; cout << "总长度:" << length << endl; system("pause");
  16. return 0;
  17. }

把 if ((cin >> word) == 0) 修改为:

if ((bool)(std::cin >> word) == 0) { 或者修改为: if (!(cin >> word))
getline 的返回值

  1. #include <iostream>
  2. #include <string>
  3. #include <Windows.h>
  4. using namespace std;
  5. int main(void) {
  6. string line;
  7. int lineCount = 0;
  8. int length = 0;
  9. cout << "请输入任意多行:";
  10. while (1) {
  11. // 遇到文件结束符时, 返回 NULL(0)
  12. if (getline(cin, line) == 0) {
  13. break;
  14. }
  15. lineCount++;
  16. length += line.length();
  17. }
  18. cout << "一共有" << lineCount << "行" << endl;
  19. cout << "总长度: " << length << endl;
  20. system("pause");
  21. return 0;
  22. }

测试代码:

  1. string line;
  2. int length = 0;
  3. getline(cin, line) >> length;
  4. cout << "line=" << line << endl;
  5. cout << "length=" << length << e

修改: if (getline(cin, line) == 0) {

修改为: if ((bool)getline(cin, line) == 0) {

或者修改为: if (!getline(cin, line)) {

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号