欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C/C++ 刷PAT过程出现的问题汇总

程序员文章站 2022-03-27 21:41:25
1.error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string,class std::allocator &g......

站在软件测试的角度上来看问题

为什么单独把他单独的拎出来讲,因为PAT的Oj的几个测试用例就是根据软件测试的方法针对性的提出几个测试用例!

       当我们对一个问题进行求解,执行案例答案一致,这个时候不要开心的太早,因为这个最简单最普通的一个测试用例。当把自己的程序丢到oj上跑时,如果出现部分答案正确部分答案错误,那么恭喜你,程序基本思路是对的。针对部分答案错误的问题,只需修改程序的出口。

       就目前刷题而言,几个测试用例见以下(欢迎评论区补充)

  1.  上面提到的最普通的案例,就是所给的案例
  2.   极端值
  3.   边界值,PAT每道题都会给出一个值得范围,这里会出一个最大值的案例。比如,题目给出N not less than 1000,n不超过1000,那么一定有个用例是n=1000的。举一反三,某些问题也可能出现n=0的情况

 

1.error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' (or there is no acceptable conversio
n)

  •  错误代码:

        string str=" ";

        cout<<str<<endl;

  • 错误原因:

        在#include<iostream.h>中string类没有重载“<<”操作符

  • 解决办法:

         c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同

         cout<<str.c_str()<<endl;

2.error C2536: 'std::pair<char [6],double>::first' : cannot specify explicit initializer for arrays

  • 错误代码

       pair <string,double> product3;
       product3 = make_pair ("shoes",20.0);

  • 错误原因

       模板使用出错

  • 解决办法

       make_pair(string("abc"),string("123"))

3.sizeof()和strlen()求字符数组长度

strlen(char*)
函数求是字符串的实际长度,它可以用来获取动态实际字符数组的长度,是从开始到遇到第一个“\0”,如果只是定义没有赋予初始值,这个结果是不确定的,它会从数组的首地址开始一直找下去,直到遇到“\0”停止查找。

sizeof()
求所占总空间的字节数,静态的,跟初始状态字符数组的大小有关系,大小等于初始时字符数组的大小或者等于初始时字符数组的大小+1('\0')

遇到的问题

在函数里面使用sizeof()求一个字符数组的长度是错误的,不信你去试试,长度恒等于8(具体情况按编译器和系统,反正是一个常量)

看两个例子

C/C++ 刷PAT过程出现的问题汇总
 

C/C++ 刷PAT过程出现的问题汇总

注意标红的地方,为什么两次都是8?明明第二幅图在main函数里同样的代码输出就是4?。原因就在于C/C++数组的传值方式。C/C++里面最玄乎的就是指针,传递数组的时候,把数组名穿进去,实际上传的该数组在内存的位置,也就是说参数接受的数组实际上是一个指针,而使用sizeof(data)其实就相当于计算sizeof(char *)。明白了吗

4.输出Id

有时候题目说明Id是5位数,固定的,即00001到99999,使用int输入的时候,00001,保存的是1,输出的时候使用格式,%05d

5.C++常见数据类型输入和输出

  • 铁打的cin,铁打的cout。么子意思呢,就是cin和cout是万能的,不用考虑类型,无脑输入无脑输出。缺点就是慢
  • 对于float类型的变量,printf()中的说明符可以用%f或%lf,而scanf()中的说明符则只能用%f

    对于double类型的变量,printf()中的说明符可以用%f或%lf,而scanf()中的说明符则只能用%lf

    对于long double类型的变量,而scanf()中的说明符则只能用%llf或者%Lf

  • printf不能输出c++的string,but,输出string.c_str()是可以的
     

6.字符串大小写转换

<algorithm>下面定义了大小写转换的函数transform(),四个参数,inputstart_index,inputend_index,outputstart_index,method,其中method有两个方法,分别是         ::tolower,::toupper,注意有::,究其原因:tolower和toupper 分别在两个地方定义了。一个是 std::tolower ,一个是在 cctype中定义的。如果单纯使用 tolower ,编译器会使用去加载这个 std::tolower ,而 std::tolower的原型是: charT toupper (charT c, const locale& loc); ,不符合transform函数的第四个参数。因此我们需要给他变型一下。也就是上面被注释掉的代码。如果要使用 cctype中的 tolower ,就直接用全局定义 :: ,即可。//transform(input.begin(), input.end(), upper.begin(), (int (*)(int))std::toupper);

#include <string>
#include <algorithm>
using namespace std;
int main()
{
        string strB = "LURY@LENOVO.com";
        printf("Before transform:\n");
        printf("strB:%s \n\n", strB.c_str());

        transform(strB.begin(), strB.end(), strB.begin(), ::toupper);
        printf("After transform to toupper:\n");
        printf("strB:%s \n\n", strB.c_str());

        transform(strB.begin(), strB.end(), strB.begin(), ::tolower);
        printf("After transform to lower:\n");
        printf("strB:%s \n\n", strB.c_str());
        return 0;
}
strB:LURY@LENOVO.com

After transform to toupper:
strB:LURY@LENOVO.COM

After transform to lower:
strB:lury@lenovo.com

 

本文地址:https://blog.csdn.net/gdc6916/article/details/105796318