gpt4 book ai didi

c - fopen 函数将垃圾放在文件路径名上

转载 作者:太空宇宙 更新时间:2023-11-04 02:40:25 27 4
gpt4 key购买 nike

我正在用 C 做一个练习。

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

现在我的问题开始了:

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

最佳答案

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 的正确长度。

关于c - fopen 函数将垃圾放在文件路径名上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32513790/

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