从一本通 1407:笨小猴的两个测试点未通过来谈谈Windows/Linux/macOS的换行符

无人久伴 提交于 2020-03-08 21:59:07

问题:一本通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了。

增加的一行: if( 0x0d == ch[i]) continue; // \r(RETURN)

#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;
}

 

一本通未通过的原因分析:

只过滤掉回车就OK了。由此推断一本通的测试数据在Windows系统里面生成或保存过,就多了一个回车符。

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

而并不是以“混用”的原因造成:

或者将gets 改为cin,还要作点相应改动,也可以 AC。
cin, cout 是C++一族的,
gets, scanf, printf是C一族的。
这两族不要混用。

 

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

 

换行符‘\n’和回车符‘\r’

 

(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'。

关于Mac换行

引用自:https://blog.csdn.net/menc15/article/details/71731825?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

根据Wikipedia-NewlineWikipedia-macOS

在2001年以前的Mac操作系统,称为Classic Mac OS,行末采用”\r”,这一系列操作系统的最后一个版本是1999年发布的Mac OS 9;

从2001年3月发布的Mac OS 10.0开始,行末采用”\n”,称为macOS或OS X。行末采用的就是与Unix一样的”\n”

Windows下的换行符是0x0D 0x0A,如下所示:

Linux下的换行符是0x0A,如下所示:

macOS 10.13.6中的换行符是0x0A,如下所示:

引用

  1. Linux/Windows/Mac OS中的回车与换行
转载 CharlotteMen 最后发布于2017-05-12 15:16:35 阅读数 4378 收藏

https://blog.csdn.net/menc15/article/details/71731825?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

 

本问题今天花了5、6小时。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!