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

相关文章
|
1月前
|
安全 程序员 编译器
【实战经验】17个C++编程常见错误及其解决方案
想必不少程序员都有类似的经历:辛苦敲完项目代码,内心满是对作品品质的自信,然而当静态扫描工具登场时,却揭示出诸多隐藏的警告问题。为了让自己的编程之路更加顺畅,也为了持续精进技艺,我想借此机会汇总分享那些常被我们无意间忽视却又导致警告的编程小细节,以此作为对未来的自我警示和提升。
104 4
C++(常见错误总结1.4)
C++(常见错误总结1.4)
|
安全 C++ Windows
C++(常见错误总结1.2,1.3)
C++(常见错误总结1.2,1.3)
|
存储 程序员 C++
C++(常见错误总结1)
C++(常见错误总结1)
BXA
|
C++
C++使用中需要避免的10个常见错误
C++使用中需要避免的10个常见错误
BXA
236 0
|
编译器 Android开发 C++
工作中遇到的C++语言基础和常见错误
## C++历史及标准 这里简单列一下```C++```发展进程中的几次重大事件以及我常使用的典型特性,各个标准支持的具体细节可参阅ISO标准文档。 - ```C With Classes```:支持C++基础语言特性,包括多态、异常处理、模板、命名空间等 - ```C++98```:STL、RTTI、模板、异常处理及其它标准库实现 - ```C++03```:修复C++98中的缺
1131 0
|
存储 C++
【C++初级】static用法总结、问题探讨及常见错误排查
static的基本用法: static的作用主要有两种第一个作用是限定作用域;第二个作用是保持变量内容持久化; 一、c语言中static的用法:   1、全局静态变量:     用法:在全局变量前加上关键字static,全局变量就定义成一个全局静态变量。
1678 0
|
C++
C++常见错误坑洞
指针没初始化就使用*解引用运算符; 连续delete释放new指针; 使用delete 是否常规普通变量内存; 地址直接复制给制作   
617 0
|
分布式计算 Java Hadoop
hadoop-HA集群搭建,启动DataNode,检测启动状态,执行HDFS命令,启动YARN,HDFS权限配置,C++客户端编程,常见错误
本篇博文为整理网络上Hadoop-HA搭建后出来的博客,参考网址为:http://blog.chinaunix.net/uid-196700-id-5751309.html 3. 部署 3.1. 机器列表 共5台机器(zookeeper部署在这5台机器上),部署如下表所示: NameNode JournalNode DataNode ZooKeeper 192.168.106
8067 0