社区讨论
NOIp C++在NOI Linux下编译时的注意事项
灌水区参与者 24已保存回复 39
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 39 条
- 当前快照
- 1 份
- 快照标识符
- @mi7crvhh
- 此快照首次捕获于
- 2025/11/20 19:33 4 个月前
- 此快照最后确认于
- 2025/11/20 23:43 4 个月前
1、在windows中可以对结构体初始化,但是在NOI Linux下测试是错误的。
1)
CPPstruct Tpoint
{
int a[20];
int num=13;
}a[100];
结构体中是不能直接初始化的。一般要用构造函数才正确。在liunx下测试0分。
如果一定要初始化又不太会写构造函数,可以用 for 循环赋值。
2、文件名不要搞错,在windows下面邹ht同学为了与a.out对齐,在a.in 后面加了一个空格,在windows下面编译通过,但是在NOI Linux下面编译错误;
1)
原来200分,在linux下0分。
错误是:
CPPifstream fin ("a.in ");
ofstream fout ("a.out");
ifstream fin ("b.in ");
ofstream fout ("b.out");
能看出来吗?我找了很久:(
3、在 windows 下面判断一行字符串是否结束:while(c!=’\n’),在 Linux 下面不
能这样判断,因为 Linux 下面字符串结尾是两个字符#13#10,而 windows 下面
则只有一个#10;现在我们来分析一下,如果是在 Linux 下面如何去读入字符串,
例:
CPP10 3
adsdfa dasjfasd asdfasdf
asewrer adrepw joo
aSDjf asdf
(1) 全部都只用 cin 读入,则对第一行数据,两个 cin 后光标停留在 3 后面,对于第二行数据 cin 制度如第一个字符串 adsdfa,然后再读入第二个字符串 dasjfasd
(2) 全部都只用 getline 读入,则读入第一行数据后(同时也读入了 Linux 下
才出现的最后两个特殊字符),并要将数字 10 3 转化成数字,具体语句
如下:
CPPwhile (s[s.size()-1]<32)
s.erase(s.size()-1,1);
(3) 如果用 cin 和 getline(cin,s)混合使用,用 cin 读完 10 3 后,后面的两个
特殊字符要用 getline(cin,s)将其读入,这个时候光标就会停留在第 2 行的
第 1 个位置;
4、linux 下不能用 int64,要用 long long,scanf("%lld",&a),printf("%d",a);
64 位(long long )输入输出:因为 windows 和 linux 两种系统下输出格式符不一致,
建议用流。但数据在 10^5 以上时,可能有点慢。linux 可用:
CPPscanf("%lld");
5、对于字符串,cin>>s;
对于大数据量的字符或者 int,float 我们建议用 scanf("%f%d%c",&a,&b,&ch);
注意用 scanf 的时候要用 freopen("a.in","r",stdin),另用 freopen 要用到库
<stdio.h>或者<cstdio>;6、注意:要用你熟悉的语句去做,不要装 13;
fin >> f[i] >> g[i++] ;
在linux下竟然是错误的!!
===========================
windows下也有类似问题:
如有函数 cal(i)
当
CPPcout << cal (3) << cal (5) <<endl;
其实是先调用 cal(5)。
7、常用函数的库,尽量把库都写进去
CPP#include <stdio.h>
#include <cstdio>
#include <cmath>
#include <iostream>
#include <fstream>
#include <algorithm> //abs\sort\max\min
#include <string>
#include <cstring>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <iomanip> //这个用来输出小数点
cout<<fixed<<setprecision(2)<<a<<endl;
8、小数输入输出:
自己编函数输出
用 printf()输出:
fprintf(out, “%.6lf\n”,res); (输出六位小数)
用流格式化输出:
CPPcout.setf(ios::fixed);
cout.precsion(2);
或样例: C++
CPP#include <iomanip>
fout<<fixed<<setprecision(6)<<data<<endl;
#include <stdio.h>
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
fscanf(fin,"%d",&tmp);
fprintf(fout,"%0.3lf",data);
9、常用函数与库
| 函数名 | 功能 | 包含库 |
|---|---|---|
| sort | algorithm | |
| max | algorithm | |
| min | algorithm | |
| memset | string.h | |
| abs | algorithm | |
| ceil | math.h | |
| floor | math.h | |
| fabs | math.h | |
| labs | math.h | |
| sin | math.h | |
| asin | math.h | |
| log | ||
| log10 | ||
| sqrt | ||
| pow | ||
| exp |
10、写 cmp 的时候,不要写<=,>=;
11、全局变量不要用find,power,max之类单词, 甚至不能用y0,y1变量。
12、位操作时,要注意范围,比如:
CPPint i =1;
cout << (i>>32) <<endl;
可能会出错,即位移
x>=32次以上可能会是只位移了 x%32 。不明白的是
cout<< (1>32)<< endl;是正确的!位操作多加括号
嗯.
回复
共 39 条回复,欢迎继续交流。
正在加载回复...