【问题标题】:Different output in Windows and Linux (gcc) C compilersWindows 和 Linux (gcc) C 编译器中的不同输出
【发布时间】:2017-10-22 00:19:34
【问题描述】:

我有一个解决迷宫的程序,它可以找到从 Start(S) 到 Exit(E) 的可能路线。这是我的迷宫:

1111S11110
0000010001
110100010d
t001111110
0100000001
0111111101
1111111101
00000D01T1
0111110001
0000E01110

可能的途径是:

Start  S  W  W  S  S  S  E  E  E  E  E  E  S  S  S  S  W  W  N  W  W  W  W  W  W  S  S  E  E  E  E   Exit

这是正确的,我在 CodeBlocks 上得到了它,但是当我通过 putty 在 dev 上编译我的代码时,我得到了这个:

Start  S  S  S  S  S  W  N  N  W  S  W  N  N  N  W  N   Exit

这是我的全部代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


// Global Variables for use
int matrixSize,startX,startY,exitX,exitY;
char src[1500] = " ";
char Ndirection[50] = " N ";
char Sdirection[50] = " S ";
char Edirection[50] = " E ";
char Wdirection[50] = " W ";

// Function for finding the array length
int numOfLines(FILE *const mazeFile) {
  int c, count;
  count = 0;
  for (;; ) {
    c = fgetc(mazeFile);
    if (c == EOF)
      break;

    if (c == '\n')
      ++count;        // end of line => increment line counter
  }
  rewind(mazeFile);

  return count+1;
}

int capLetter(char ch){
   int result = 0;
   if(ch >= 'A' && ch <= 'Z'){
        result = 1;
   }
   return result;
}

int lowLetter(char ch){
   int result = 0;
   if(ch >= 'a' && ch <= 'z'){
        result = 1;
   }
   return result;
}

int isSafe(char Mazearray[matrixSize][matrixSize],int x,int y){
    if(x >= 0 && x < matrixSize && y >= 0 && y < matrixSize && Mazearray[x][y] != '1'){
        return 1;
    }
    return 0;


}

void MazeSolution(char Mazearray[matrixSize][matrixSize],int x,int y,char pathArray[matrixSize][matrixSize],char wasHereArray[matrixSize][matrixSize]){
    if(recursiveMaze(Mazearray,x,y,pathArray,wasHereArray) == 0){
        printf("There does not exist a possible solution!!!");
    }
    else{
        pathArray[startX][startY] = 'S';
    }
}

int recursiveMaze(char Mazearray[matrixSize][matrixSize],int x,int y,char pathArray[matrixSize][matrixSize],char wasHereArray[matrixSize][matrixSize]){
    if(x == startX && y == startY){
        pathArray[x][y] = 'S';
    }
    if(x == exitX && y == exitY){
        pathArray[x][y] = 'E';
        return 1;
    }
    // check if the coordinate is safe to go(not 1)
    if(isSafe(Mazearray,x,y) == 1 && wasHereArray[x][y] != '1'){
        wasHereArray[x][y] = '1';

        // Move North
        if(recursiveMaze(Mazearray,x-1,y,pathArray,wasHereArray) == 1){
            pathArray[x][y] = 'R';
            strcat(src,Ndirection);
            return 1;
        }
        // Move South
        if(recursiveMaze(Mazearray,x+1,y,pathArray,wasHereArray) == 1){
            pathArray[x][y] = 'R';
            strcat(src,Sdirection);
            return 1;
        }
        // Move East
        if(recursiveMaze(Mazearray,x,y+1,pathArray,wasHereArray) == 1){
            pathArray[x][y] = 'R';
            strcat(src,Edirection);
            return 1;
        }
        // Move West
        if(recursiveMaze(Mazearray,x,y-1,pathArray,wasHereArray) == 1){
            pathArray[x][y] = 'R';
            strcat(src,Wdirection);
            return 1;
        }
    }
    return 0;
}

// Main Function
int main( int argc, char **argv )
{
    // Opening the Matrix File
    FILE *mazeFile;
    mazeFile = fopen(argv[1], "r" );
    if( mazeFile == NULL )
        return 1;
    matrixSize = numOfLines( mazeFile );
    // Reading text file into 2D array
    int i,j;
    char mazeArray [matrixSize][matrixSize];

    for (i = 0; i<matrixSize; i++) {
        for (j = 0; j<matrixSize; j++) {
            fscanf(mazeFile, "%c", &mazeArray[i][j]);
        }

        char eol;
        fscanf(mazeFile, "%c", &eol);
    }
    // Variables

    //Creating path array
    char pathArray[matrixSize][matrixSize];
    for (i = 0; i < matrixSize; i++){
       for (j = 0; j < matrixSize; j++){
            pathArray[i][j] = '0';
        }
    }
    // CheckPoint array
    char wasHereArray[matrixSize][matrixSize];
    for (i = 0; i < matrixSize; i++){
       for (j = 0; j < matrixSize; j++){
            wasHereArray[i][j] = '0';
        }
    }
    // Finding start and exit indexes
    for (i = 0; i<matrixSize; i++) {
      for (j = 0; j<matrixSize; j++) {
        if(mazeArray[i][j] == 'S'){
            startX = i;
            startY = j;
        }
        if(mazeArray[i][j] == 'E'){
            exitX = i;
            exitY = j;
        }
      }
    }

    MazeSolution(mazeArray,startX,startY,pathArray,wasHereArray);
    char *data = src;
    int length=strlen(data);
    char bytes[length];
    int n=0;
    while(n<=length)
    {
       bytes[n] = data[length-n-1];
       n++;
    }

    FILE *f = fopen("path.txt", "w");
    fprintf(f, "Start %s Exit",bytes);
    fclose(mazeFile);
    fclose(f);
    return 0;
}

我不知道哪里出了问题,从哪里开始?

【问题讨论】:

  • 现在可能是学习使用调试器的好时机。您是否在 Windows 上制作了迷宫文件?尝试在 Linux 机器上运行 dos2unix mazefile.txt 然后再次运行您的程序。或者在 Windows 上使用 Notepad++ 之类的东西来保存带有 Unix 行结尾的文件。
  • 是的,我很认真。我是一名学生,不太熟悉 c 和 linux。只是寻求其他更有经验的人的帮助或提示以找出我的错误。而且据我所知,一个人不应该在没有帮助的情况下嘲笑某事。
  • 退休忍者,感谢您的关注。是的,我在 Windows 上调试过它,没有错误等。那么你所说的 dos2unix 是什么意思?你能给我更多的提示吗?
  • Linux 上的一个程序,用于将具有 Windows 行尾的文件转换为 Unix 行尾。你就像我展示的那样运行它。
  • 是的,使用 Windows 行尾,如答案中所述,您将阅读每行上的额外字符,因此您的迷宫会倾斜。在格式字符串中放置一个空格(如“%c”)也可能有效,因为这通常会导致它吃掉空格。无论如何,这只是让跨平台代码变得有趣的事情之一。 :)

标签: c linux windows gcc output


【解决方案1】:

DOS 行尾是 CR-LF ("\r\n") 和 *nix 行尾只是 LF ("\n")。更改这些行main:

char eol;
fscanf(mazeFile, "%c", &eol);

到:

int c = fgetc(mazefile); // Slurp a '\r' carriage return or '\n' linefeed character.
if ('\r' == c) { 
    c = fgetc(mazefile); // slurp the '\n' linefeed character.
}

【讨论】:

  • 这应该能让你在 *nix 和 DOS 上工作,但它并不完美。它可以通过健全性检查来加强一点,并涵盖行尾只是 '\r' 的奇怪情况。
猜你喜欢
  • 1970-01-01
  • 2020-05-18
  • 2011-07-24
  • 2014-03-26
  • 1970-01-01
  • 2015-01-16
  • 2011-01-14
  • 2013-01-02
  • 2011-08-23
相关资源
最近更新 更多