03/08 21:53

# 问题：一本通1407：笨小猴(洛谷P1125 笨小猴) 第8个和第10个测试点不能通过，而相同的代码在洛谷上没问题。

``````#include <bits/stdc++.h>
using namespace std;

int main() {
char ch[110];
gets(ch);
printf("%d.", strlen(ch));
int n = strlen(ch), max = 0, min = 100;
for (int i = 0; i < n; i++) {
int t = 0;
//if( 0x0d == ch[i]) continue; // \r(RETURN)
for (int j = 0; j < n; j++)
if (ch[i] == ch[j]) t++;

if (t > max) max = t;
if (t < min) min = t;
}
int x = max - min;
if (x >= 2) {
int flag = 0;
for (int i = 2; i <= sqrt(x); i++) {
if (x % i == 0) {
flag = 1;
break;
}
}
if (flag == 0)  cout << "Lucky Word" << endl << x;
else            cout << "No Answer"  << endl << '0';
} else             cout << "No Answer"  << endl << 0;

return 0;
}
``````

# 以上代码将gets换为scanf后全过

``````#include <bits/stdc++.h>
using namespace std;
// lg: P1125 笨小猴
inline bool is_small_alpha(char x) { return 'a' <= x && 'z' >= x; }

int main() {
char ch[110];
//gets(ch);
scanf("%s", ch);
int n = strlen(ch), max = 0, min = 100;
for (int i = 0; i < n; i++) {
int t = 0;
//if( 0x0d == ch[i]) continue; // \r(RETURN)
for (int j = 0; j < n; j++)
if (ch[i] == ch[j]) t++;

if (t > max) max = t;
if (t < min) min = t;
}
int x = max - min;
if (x >= 2) {
int flag = 0;
for (int i = 2; i <= sqrt(x); i++) {
if (x % i == 0) {
flag = 1;
break;
}
}
if (flag == 0)  cout << "Lucky Word" << endl << x;
else            cout << "No Answer"  << endl << '0';
} else             cout << "No Answer"  << endl << 0;

return 0;
}``````

# 增加过滤回车后一本通也AC了。

``````#include <bits/stdc++.h>
using namespace std;

int main() {
char ch[110];
gets(ch);
printf("%d.", strlen(ch));
int n = strlen(ch), max = 0, min = 100;
for (int i = 0; i < n; i++) {
int t = 0;
if( 0x0d == ch[i]) continue; // \r(RETURN)
for (int j = 0; j < n; j++)
if (ch[i] == ch[j]) t++;

if (t > max) max = t;
if (t < min) min = t;
}
int x = max - min;
if (x >= 2) {
int flag = 0;
for (int i = 2; i <= sqrt(x); i++) {
if (x % i == 0) {
flag = 1;
break;
}
}
if (flag == 0)  cout << "Lucky Word" << endl << x;
else            cout << "No Answer"  << endl << '0';
} else             cout << "No Answer"  << endl << 0;

return 0;
}
``````

# 一本通未通过的原因分析：

gets是以行结束或文文件结尾作为结束的。在不同的系统中行结束不同

cin, cout 是C++一族的，
gets, scanf, printf是C一族的。

# Windows/Linux/macOS系统中的换行符

（1）换行符就是另起一行  --- '\n' 10 换行（newline）

（2）回车符就是回到一行的开头 --- '\r' 13 回车（return）

（1）在微软的MS-DOS和Windows中，使用“回车CR('\r')”和“换行LF('\n')”两个字符作为换行符;

（2）Windows系统里面，每行结尾是 回车+换行(CR+LF)，即“\r\n”；

（3）Unix系统里，每行结尾只有 换行CR，即“\n”；

（4）Mac系统里，每行结尾是 回车CR 即'\r'。

# 引用

1. Linux/Windows/Mac OS中的回车与换行

0
1 收藏

### 作者的其它热门文章

gets, gets_s

C

char *gets( char *str );
(C11 中移除)
char *gets_s( char *str, rsize_t n );
(C11 起)
(可选)

1) 从 stdin 读入 str 所指向的字符数组，直到发现换行符或出现文件尾。在读入数组的最后一个字符后立即写入空字符。换行符被舍弃，但不会存储于缓冲区中。
2) 从 stdin 读取字符直到发现换行符或出现文件尾。至多写入 n-1 个字符到 str 所指向的数组，并始终写入空终止字符（除非 str 是空指针）。若发现换行符，则忽略它并且不将它计入写入缓冲区的字符数。

n 为零
n 大于 RSIZE_MAX
str 是空指针

03/08 22:06

1 评论
1 收藏
0