【问题标题】:fopen function puts garbage on the file pathnamefopen 函数将垃圾放在文件路径名上
【发布时间】:2015-09-11 00:47:06
【问题描述】:

我正在用 C 做一个练习。

程序接收文件名作为参数,不带扩展名,(“p01”或“p02”等。) 程序必须打开三个名为(如果输入“p01”)“p01_c.txt”、“p01_w.txt”和“p01_p.txt”的文件。 我将文件路径保留到 p01 到字符串 ruta 中,并在使用 fopen(ruta, "rb") 打开文件之前将扩展名“_c.txt”、“_w.txt”附加到 strcat()

现在我的问题开始了:

1) 在fopen() 之后,ruta 中出现了一些垃圾。

2) 我无法将\0 放在我想剪断字符串的位置。

我在网上搜索了一个答案,但我没有找到任何答案,所以我第一次在这里问。

这是我的代码:

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

int main(int argc, char *argv[])
{
    if(argc<2) {
        printf("\nNo se ha introducido un fichero válido\n");
        return -1;
    } else {
        char ruta [] = "";
        strncat(ruta,argv[0],strlen(argv[0])-14);
        strcat(ruta,"knapsack\\");                    // knapsack is the folder containing th files
        strcat(ruta,argv[1]);                         //  now ruta is:  ...\knapsack\p01

        FILE * fCapacidad;
        strcat(ruta,"_c.txt");                        // ruta is: ... \knapsack\p01_c.txt
        printf("1- ruta is: %s\n",ruta);               // ruta is OK
        fCapacidad = fopen(ruta , "rb");
        if(fCapacidad == NULL){
            fputs ("\nNo se ha introducido un fichero válido de capacidad\n",stderr); exit(1);
        }

        FILE * fPesos;
        printf("2- ruta is: %s\n",ruta);                // ruta HAS GARBAGE!!!
        ruta[strlen(ruta-6)] = '\0';
        printf("3- ruta is: %s\n",ruta);               // ruta IS NOT CROPPED!!!
        strcat(ruta,"_w.txt");
        printf("4- ruta is: %s\n",ruta);             //_w.txt is appended to ruta (OK)
        fPesos = fopen(ruta, "rb");

输出是:

1- ruta is: E:\C Projects\MochilaEnC\bin\Debug\knapsack\p01_c.txt
2- ruta is: E:\C Projh>w\MochilaEnC\bin\Debug\knapsack\p01_c.txt
3- ruta is: E:\C Projh>w\MochilaEnC\bin\Debug\knapsack\p01_c.txt
4- ruta is: E:\C Projh>w\MochilaEnC\bin\Debug\knapsack\p01_c.txt_w.txt
No se ha introducido un fichero vßlido de pesos

【问题讨论】:

  • 在这种情况下,Conflan,删除问题是最简单的。这是一个完全可以的问题,但它并没有真正为其他任何人提供启发。 (我认为不太可能有人会出现并想知道“如果我为字符串分配一个字节然后使用 40 个字节,会发生什么以及如何阻止它发生?”)如果 @user3121023 想要发布一个答案,我认为现在已经发生了。或者,您可以等待它被搁置然后删除。关键的教训是确保你知道你在哪里(以及如何)分配你正在使用的空间。
  • 你说你有运行时问题,那么你没有发布干净编译的代码。事实上,发布的代码甚至没有接近编译,更不用说干净编译了。请发布干净编译并显示问题的代码。

标签: c arrays string fopen garbage


【解决方案1】:

char ruta[] = ""; 只为数组分配一个字符。与char ruta[1] = ""; 相同。连接到数组时,超出了数组的边界。
使用char ruta[200] = ""; 将为数组分配200 个字符并将数组初始化为空字符串。最多可以将 199 个字符连接到数组。您可以使用任何可以满足您的内存需求的值,我只是以 200 为例。

'\0' 分配给数组中的索引的另一个问题可以通过ruta[strlen(ruta) - 6] = '\0'; 完成。最好验证 ruta 的长度至少为 6,否则您可能会得到一个负索引。
在发布的代码中,6 在括号内,ruta。这将采用ruta 的地址并减去6。然后strlen() 将从该地址开始并尝试确定字符串的长度。任何结果都不是ruta 的正确长度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多