C++——常见错误总结1.4

简介: C++——常见错误总结1.4

switch错误

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

gcc编译器中,不能通过编译。

#include <stdio.h>
int main(void) {
       int c;
       scanf("%d", &c);
       switch(c) {
       case 1:
              int x = 0;    //错误!
              printf("c=1");
              break;
       case 2:
              printf("c=2");
              break;
       default:
              printf("other");
              break;
       }
       return 0;
}

应该修改为:

#include <stdio.h>
int main(void) {
       int c;
       scanf("%d", &c);
       switch(c) {
       case 1:
              {
                     int x = 0;    //错误!
                     printf("c=1");
              }
              break;
       case 2:
              printf("c=2");
              break;
       default:
              printf("other");
              break;
       }
       return 0;
}

不安全函数(scanf等)

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main(void)
{
      int num;
      scanf("%d", &num);
      system("pause");
      return 0;
}

vs中不能直接使用scanf等C标准库函数

因为vs使用更安全的c11标准, 认为这类函数不安全。

这类函数正常使用时,是没有任何问题的

但是,部分黑客可能会利用其中的缺陷,开发恶意软件,对系统造成影响


解决方案:

1.方法1:使用修改项目的属性,直接使用这些“不安全”的函数。

添加: /D _CRT_SECURE_NO_WARNINGS


67541441fd464e8599894598394565ce.png


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

int x;
scanf_s("%d", &x);  //不需要使用第3个参数,用法和scanf相同
float  f;
scanf_s("%f", &f);  //不需要使用第3个参数, 用法和scanf相同
char c;
scanf_s("%c", &c, sizeof(c)); //需要使用第3个参数, 否则有告警
char name[16];
scanf_s("%s", name, sizeof(name)); //需要使用第3个参数
int age;
char name[16];
scanf_s("%d%s", &age, name, sizeof(name));

cin >> 的返回值

#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
int main(void) {
       string word;
       int count = 0;
       int length = 0;
       cout << "请输入任意多个单词:";
       while (1) {
              if ((cin >> word) == 0) {  //在 vs中不能通过编译
                     break;
              }
              count++;
              length += word.length();
       }
       cout << "一共有" << count << "单词" << endl;
       cout << "总长度:" << length << endl;
       system("pause");
       return 0;
}



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

if ((bool)(std::cin >> word) == 0) {

或者修改为:

if (!(cin >> word)) {

getline的返回值


#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
int main(void) {
      string line;
      int lineCount = 0;
      int length = 0;
      cout << "请输入任意多行:";
      while (1) {
            // 遇到文件结束符时, 返回NULL(0)
            if (getline(cin, line) == 0) {
                  break;
            }
            lineCount++;
            length += line.length();
      }
      cout << "一共有" << lineCount << "行" << endl;
      cout << "总长度: " << length << endl;
      system("pause");
      return 0;
}

测试代码:

  string line;
    int length = 0;
    getline(cin, line) >> length;
    cout << "line=" << line << endl;
    cout << "length=" << length << endl;

c0965ae9e6e04b7eaa29c80f545b3fa8.png

修改:

if (getline(cin, line) == 0) {

修改为:

if ((bool)getline(cin, line) == 0) {

或者修改为:

if (!getline(cin, line)) {


if语句后面误加分号

int age;
    cout << "请输入年龄: ";
    cin >> age;
    if (age > 40); {
        cout << "大叔" << endl;
    }

严格遵循代码规范,做到零警告。

以上代码在VS中编译时,会有警告warning

相关文章
|
29天前
dragger 2 常见错误
dragger 2 常见错误
10 0
|
7月前
|
存储 自然语言处理 Java
Elasticsearch常见错误及如何排查错误
Elasticsearch常见错误及如何排查错误
206 0
|
10月前
|
存储 程序员 C++
C++(常见错误总结1)
C++(常见错误总结1)
|
10月前
|
编译器 C++
常见错误总结1.4
常见错误总结1.4
|
10月前
|
安全 C++ Windows
C++(常见错误总结1.2,1.3)
C++(常见错误总结1.2,1.3)
|
10月前
|
C++
C++(常见错误总结1.4)
C++(常见错误总结1.4)
|
10月前
|
Python
常见错误解决方案汇总
常见错误解决方案汇总
64 0
BXA
|
11月前
|
C++
C++使用中需要避免的10个常见错误
C++使用中需要避免的10个常见错误
BXA
161 0
|
IDE 测试技术 PHP
如何调试PHP代码?在项目中如何排查错误?
如何调试PHP代码?在项目中如何排查错误?
215 0