2015-09-11 1 views
1

Я делаю упражнение на C.Еорепа функции помещает мусор на пути доступа к файлу

Программы принимает в качестве аргумента имя файла, без расширения, («Р01», или «P02» и так далее.) Программа должна открыть три файла с именем (в случае ввода «p01») «p01_c.txt», «p01_w.txt» и «p01_p.txt». . Я держу путь к файлу до Р01 в строку ruta «и просто добавить расширение„_c.txt“,„_w.txt“с strcat() перед открытием файла с 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 
+1

В этом контексте, Conflan, проще всего удалить вопрос. Это совершенно нормально, но на самом деле это не освещает кого-либо еще. (Я не думаю, что это вероятно, что кто-то придет и захочет узнать «Если я выделил один байт для строки, а затем использовал 40 байт, что происходит и как это остановить?») Если @ user3121023 хотел отправьте ответ, который, должно быть, произошел к настоящему времени, я думаю. Кроме того, вы можете дождаться, когда он будет переведен на удержание и затем удален. Основной урок - убедиться, что вы знаете, где (и как) вы выделили пространство, которое вы используете. –

+0

Ваша поговорка о том, что у вас есть проблема времени выполнения, тогда вы не опубликовали код, который с готовностью компилируется. На самом деле опубликованный код даже не приближается к компиляции, а тем более чисто компилируется. Пожалуйста, отправьте код, который тщательно компилирует и показывает проблему. – user3629249

ответ

2

char ruta[] = ""; только выделяет один символ в массив. Это то же самое, что и char ruta[1] = "";. При конкатенации массива границы массива превышены.
Использование char ruta[200] = ""; будет выделять 200 символов массиву и инициализировать массив пустой строкой. До 256 символов могут быть объединены с массивом. Вы можете использовать любое значение, которое будет соответствовать вашим потребностям в памяти, я просто использовал 200 в качестве примера.

Другой вопрос о присвоении '\0' индексу в массиве может быть выполнен с помощью ruta[strlen(ruta) - 6] = '\0';. Было бы неплохо проверить, что ruta имеет длину не менее 6, иначе вы можете получить отрицательный индекс.
В опубликованном коде 6 находился в круглой скобке с ruta. Это займет адрес ruta и вычитает 6. Затем strlen() начнет с этого адреса и попытается определить длину строки. Любой результат не будет иметь правильную длину ruta.

Смежные вопросы