C++基础—命令行手动编译

控制台乱码问题

本质原因

Windows系统下
默认控制台编码格式为936(ANSI/OEM - 简体中文 GBK)
而C程序文件默认编码格式为utf-8
由于编码格式不一致,程序运行时会出现中文乱码

解决方法

修改源码 使用系统调用

增添头文件和调用API函数SetConsoleOutputCP(65001)
主动设置控制台输出的编码为utf-8格式

另存为

记事本打开C程序文件,点击【文件】–【另存为】,选择ANSI编码格式并替换原文件

vscode

如果是在vs code运行出现中文乱码,一般是将编码格式从utf-8修改为gbk、gb2312或者gb18030等即可

空格: 报错 illegal character U+00A0

image.png

n 滑块游戏,第二部分是 2n+1
个字符,表示该游戏的某个格局
如果不是目标格局,则按顺序(将格局看作字符串后,按照字典序排序,即
B < E < W)输出该格局的所有后继格局。例如,BBEBWWW 格局应该排在
BBWBWEW 格局的前面。

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. //将数组的第i个元素和第j个元素互换
  5. void swap(char str[], int i, int j) {
  6. char ch = str[i];
  7. str[i] = str[j];
  8. str[j] = ch;
  9. }
  10. // 将result数组的 前counter行 进行冒泡排序
  11. void bubbleSort(char result[][20], int counter, int length) {
  12. char str[20];
  13. for (int i = counter - 1; i > 0; i--) // 从第 counter个开始
  14. for (int j = 0; j < i - 1; j++)
  15. if (strcmp(result[j + 1], result[j]) < 0) {
  16. strcpy(str, result[j]);
  17. strcpy(result[j], result[j + 1]);
  18. strcpy(result[j + 1], str);
  19. }
  20. }
  21. //判断sliders是否为目标格局
  22. bool check(char* sliders,int length) {
  23. int wMaxIndex = 0;//最后一个白色将牌的下标
  24. int bMinIndex = 0;//第一个黑色将牌的下标
  25. for (int i = 0; i < length; i++) {
  26. if (sliders[i] == 'W')
  27. wMaxIndex = i;
  28. else if (sliders[i] == 'B')
  29. bMinIndex = i;
  30. }
  31. if (wMaxIndex < bMinIndex)
  32. return true;
  33. return false;
  34. }
  35. int main() {
  36. //假设输入的最大格局数是6,每个格局的最大长度是20
  37. const int MAX_N = 6;//输入的最大格局数
  38. const int MAX_LEN = 20;//每个格局的最大长度
  39. char buffer[MAX_N][MAX_LEN];//假设输入的格局不超过6个,每个格局不超过20个字符。
  40. int N;
  41. cin >> N; //3
  42. for (int i = 0; i < N; i++) {
  43. int numSlider;
  44. cin >> numSlider;
  45. cin >> buffer[i];
  46. }
  47. for (int k = 0; k < N; k++) {
  48. //对每一个格局进行遍历处理
  49. int counter = 0; //记录该格局的后继格局数
  50. int length = strlen(buffer[k]); //length是当前格局的长度
  51. char sliders[20];
  52. char result[10][20]; //存放该格局的所有后继格局,假设不超过10个
  53. cout << "结果_" << k + 1 << endl;
  54. strcpy(sliders, buffer[k]); //将当前格局复制到sliders中
  55. if (check(sliders,length)) {
  56. //检查当前格局是否为目标格局
  57. cout << "目标格局" << endl;
  58. continue;
  59. }
  60. for (int i = 0; i < 10; i++) {
  61. // 将当前格局复制到二维数组result的每一维上
  62. strcpy(result[i], sliders);
  63. }
  64. int index = 0;
  65. for (; index < length; index++) {
  66. // 查找空格字符E的下标
  67. if (sliders[index] == 'E')
  68. break; // index 指向 E
  69. }
  70. for (int offset = 1; offset < 4; offset++) {
  71. if (index + offset < length) {
  72. // E 向右找 1 2 3
  73. swap(result[counter], index, index + offset); //将空格和它右边的将牌交换
  74. counter++;
  75. }
  76. if (index - offset >= 0) {
  77. // E 向左找 1 2 3
  78. swap(result[counter], index, index - offset); //将空格和它左边的将牌交换
  79. counter++;
  80. }
  81. }
  82. bubbleSort(result, counter, length); // 当前格局的所有后继格局排序
  83. for (int m = 0; m < counter; m++) // 输出当前格局的所有后继格局
  84. cout << result[m] << endl;
  85. }
  86. return 0;
  87. }