C无法在Unix中打开文件,但可以在macOSx上正常工作

C无法在Unix中打开文件,但可以在macOSx上正常工作,c,file-io,fopen,C,File Io,Fopen,我已经编写了一个程序来逐行反转.txt文件,并将输出返回到一个新文件。命令行参数不包含.txt扩展名是要求的一部分,因此在文件上调用fopen之前,我在程序顶部添加了该扩展名。这在macOSx终端中工作得非常好,如您在此处所见: 但是,当我将其上传到学校的服务器时,我得到以下输出: 相关代码: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h>

我已经编写了一个程序来逐行反转.txt文件,并将输出返回到一个新文件。命令行参数不包含.txt扩展名是要求的一部分,因此在文件上调用fopen之前,我在程序顶部添加了该扩展名。这在macOSx终端中工作得非常好,如您在此处所见:

但是,当我将其上传到学校的服务器时,我得到以下输出:

相关代码:

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

#define NUMARG 3
#define INFILEARG 1
#define OUTFILEARG 2

int countWords(const char *sentence);

int main(int argc, char *argv[]){

    /* File pointers */
    FILE *finp;
    FILE *foutp;

    /* Three levels of strings: word < line < text. 
       Both token variables to use with strtok splitting the text. */
    char **holdWords = NULL, *holdLine = NULL, *holdText = NULL,
             *lineToken = NULL, *wordToken = NULL;
    int stringSize = 0, totalStrings, i;
    size_t size = 0;

    /* Add .txt extension */
    int inFileNameSize = sizeof(argv[INFILEARG]);
    int outFileNameSize = sizeof(argv[OUTFILEARG]);

    char inFileName[inFileNameSize+4]; //add 4 to have room for ".txt"
    char outFileName[outFileNameSize+4];

    strcat(inFileName, argv[INFILEARG]);
    strcat(inFileName, ".txt");
    strcat(outFileName, argv[OUTFILEARG]);
    strcat(outFileName, ".txt");

    /* Check for errors in argument number and opening files. */
    if(argc != NUMARG){
            printf("You have to put the input and output files after the program name.\n"); fflush(stdout);
            return(1);
    }

    if( (finp = fopen(inFileName, "r")) == NULL ){
            printf("Couldn't open %s for reading.\n", inFileName); fflush(stdout);
            return(1);
    }

    if( (foutp = fopen(outFileName, "w")) == NULL){
            printf("Couldn't open %s for writing.\n", outFileName); fflush(stdout);
            return(1);
    }
有人能帮我弄清楚这是怎么回事吗?多谢各位


编辑以解释为什么不同于链接问题:虽然了解指向数组的指针的大小不能为sizeof'd很有帮助,但我的问题是如何将字符串的大小设置为一个指针,而不是指向指针的指针。我在mac上使用strlen时出错,但它在unix上工作。我在使用unix的sizeof时出错,但sizeof在我的mac上工作

您的文件似乎存在缓冲区溢出,您可以从打印的文件名已损坏的事实中看出这一点

如果你看这些线:

/* Add .txt extension */
int inFileNameSize = sizeof(argv[INFILEARG]);
int outFileNameSize = sizeof(argv[OUTFILEARG]);

您的错误在于使用了sizeof运算符。这将返回类型的大小,而不是字符串的长度。因此,in/outFileNameSize变量对于要复制到其中的实际字符串来说太短。

sizeofargv[INFILEARG]-um。这是指针的大小。如果您想要字符串的长度,请使用strlen。与sizeofargv[OUTFILEARG]类似,您的程序也会调用未定义的行为,因为您在不保证包含终止nullchar的目标缓冲区上调用strcat。inFileName和outFileName均未初始化。至少每个函数的第一部分应该是strcpy-ed,回想main的声明,例如..char*argv[]这是一个指针数组。哇,太酷了。非常感谢。那么,在下面的示例中,当我使用malloc时,是否正确使用了sizeof?:char**holdText=mallocsize+1*sizeof*holdText@Zacharysedivane sizeof运算符返回该对象的大小,而不是其长度,请使用strlen。Okay的可能副本,可在unix计算机上运行。但我在mac电脑上看到了这一点:./p2.o file1 file2无法打开?R?file1.txt进行读取。@zacharysedivan从:1如何首先检查C中的主要参数开始。2之后,使用代码将其扩展到,如何在检查后基于主参数在C中打开文件。3后者编写另一个代码,说明如何检查文件(如果存在于C中)4如果存在该文件,则如何打开该文件5然后如何读取该文件。