При компиляции программы подсчета строк в Solaris добавляются три дополнительные строки в отличие от MacOSX - PullRequest
0 голосов
/ 01 мая 2011

Я написал следующий код под MacOSX в XCode. При переносе кода на сервер Solaris подсчитываются три дополнительные строки, и я не могу понять, почему.

#include <stdio.h>
#define MAXLINE 281 // 281 is a prime number!!
char words[4][MAXLINE]; // words array to hold menu items
char displayfilename[4][MAXLINE]; //filename array to hold filename for display function
char exit_choice[4][MAXLINE]; //for user interaction and end of each function
int i; //standard array variable
int loop = 1; //control variable for my loop
int main() 

{ 
    printf("Enter filename: ");
    scanf("%s", displayfilename[i]);
    FILE *fp; 
    int clo_c , clo_nc, clo_nlines; 
    fp = fopen(*displayfilename,"r"); // open for reading */  

    if ( fp == NULL ) 
    { 
        printf("Cannot open for reading!\n");

    } 

    clo_c = getc( fp ) ;            
    while (  clo_c != EOF ) 
    { 
        if (clo_c == '\n')
            clo_nlines++ ;

        clo_nc++ ;  
        clo_c = getc ( fp ); 
    } 

    fclose( fp ); 

    if ( clo_nc != 0 ) 
    {

        printf("There are %d lines in this file.\n", clo_nlines);
    }
    else 
        printf("File is empty, exiting!\n");
} 

Может кто-нибудь объяснить мне, что Solaris добавляет три к clo_nlines?

Ответы [ 3 ]

4 голосов
/ 01 мая 2011

Вы не инициализировали clo_nlines - поэтому вы получили «неопределенное поведение».

Объявление переменной в C не устанавливает ее значения на что-либо - она ​​просто выделяет некоторую память для этой переменной, и какой бы мусор ни находился в этом бите (ну, не бит, но вы поняли идею>.>) памяти это то, что переменная начинается как.

1 голос
/ 01 мая 2011

Здесь есть несколько проблем.

Первый, с точки зрения пуленепробиваемого кода, это точка @ Zilchonum, что clo_nc и clo_nlines не инициализируются. В старом Си это означает, что вы не имеете ни малейшего представления о том, с чего они начнут, и поэтому не имеете ни малейшего представления о том, чем вы закончите.

Однако более поздние стандарты C определяют, что неинициализированные переменные установлены в 0, так что, вероятно, это не так, если вы не установили компилятор на более раннее поведение с флагами.

Скорее всего, Аури считает, что разные машины используют разные стандарты перевода строки. Тем не менее, я считаю, что Mac OS / X использует один символ для перевода строки, так же как и Solaris.

Что приводит нас к самому файлу. Попробуйте использовать oc -c, чтобы увидеть, что на самом деле находится в файле. Я предполагаю, что вы найдете файл в одной системе \r\n новых строк, но в другой системе есть \n новых строк, вероятно, в результате настроек используемой вами программы передачи файлов. Вероятно, он преобразован в формат UNIX на одном, но не на другом.

0 голосов
/ 01 мая 2011

Вы удостоверились, что не считаете crlf как два перевода строки?

...