gpt4 book ai didi

C 无法在 Unix 中打开文件,但在 macOSx 上运行良好

转载 作者:行者123 更新时间:2023-11-30 14:54:21 26 4
gpt4 key购买 nike

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

但是,当我将其上传到学校的服务器时,我得到以下输出:https://imgur.com/a/rCdaI

相关代码:

#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 很有帮助,但我的问题是关于获取字符串的大小(一个指针,而不是指向指针)。我在 Mac 上使用 strlen 时遇到错误,但它可以在 UNIX 上运行。我在使用 unix 的 sizeof 时遇到错误,但 sizeof 在我的 mac 上有效。

最佳答案

看来您有缓冲区溢出,您可以通过打印的文件名出现损坏来看出这一点。

如果你看一下这些行:

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

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

关于C 无法在 Unix 中打开文件,但在 macOSx 上运行良好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46839652/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com