不能同时使用argv,不能运行两次分段故障

发布于 2025-01-19 16:07:26 字数 2613 浏览 2 评论 0原文

我一直在尝试各种方法来让我的程序运行。无论天气如何,我都会先尝试 argv1 或 argv2,第二个会出现分段错误。即使我尝试在 move() 之后打印 SOURCE2DEFINE 或 argv[2] ,它也会出现分段错误。我无法移动两个文件,尝试运行移动两次将导致分段错误。我假设它必须与指针和分配有关。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#define SOURCEDEFINE argv[1]
#define SOURCE2DEFINE argv[2]
#define DESTDEFINE argv[argc - 1]
#define ARGCDEFINE argc
#define COMMANDDEFINE argv[0]

int getIndex(char, char*);
char* fileGetName(char*);
void move(char*, char*);
void copy(char*, char*);
int main(int argc, char** argv)
{


    printf("Test Argc: %d\n", argc);
    int lengthArray = argc-2;
    printf("Test Length: %d\n", lengthArray);
    
    printf(" command %s\n", COMMANDDEFINE);


    printf("%s\n", DESTDEFINE);

    if(strcmp("./copy", COMMANDDEFINE) == 0)
    {
        // copy(source, dest);
    }
    else if(strcmp("./move", COMMANDDEFINE) == 0)
    {
    
        int i = 1;
    
printf("Test 1: %s\n", argv[i]);
printf("Test 2: %s\n", argv[argc-1]);
    
    move(SOURCEDEFINE, DESTDEFINE);
        printf("%s Filename debug \n", SOURCE2DEFINE);
    move(SOURCE2DEFINE, DESTDEFINE);
    //  i++;
}
return 0;
}


void moveMultiple(int argc, char** argv){
        int index = 1;
        while(argv[index] != NULL){
            if(index < argc  - 1){
                move(argv[index],argv[argc - 1]);
                index++;
            }

        }

}

void move(char *source, char* dest)
{
    printf("Running Move\n");

  // FILE *s = fopen(source, "r");
//  FILE *s;

    //FILE *s = fopen(source, "r");
    strcat(dest, fileGetName(source));

int l = link(source, dest);
    //if(s == NULL)
        if(l)
    {

        printf("Error, File Not Found");
                perror("Link");
        fflush(stdout);
        exit(1);
    }
remove(source);

}

void copy(char *source, char* dest)
{
    printf("Running Copy\n");

    strcat(dest, fileGetName(source));


int l = link(source, dest);
    //if(s == NULL)
        if(l)
    {

        printf("Error, File Not Found");
                perror("Link");
        fflush(stdout);
        exit(1);
    }
}


char* fileGetName(char *filename)
{
int i = 0;

int length = strlen(filename);

char *catString;
int index = getIndex('/', filename);
index--;
memcpy(catString,&filename[index], length);
return catString;
}


int getIndex(char i, char *s)
{
    printf("Running getIndex\n");
      int index = -1;
      for(int l =0; l<strlen(s); l++){
                         if(s[l] == i) {
                  index = l;
             }
      }
      return index;
}

Ive been trying various ways to get my program to work. regardless of weather i try argv1 or argv2 first, the second one will segmentation fault. even if i try to print SOURCE2DEFINE or argv[2] AFTER a move() it will segmentation fault. i cannot move both files trying to run move twice will result in a segmentation fault. im assuming that it has to be something to do with pointers and allocation.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#define SOURCEDEFINE argv[1]
#define SOURCE2DEFINE argv[2]
#define DESTDEFINE argv[argc - 1]
#define ARGCDEFINE argc
#define COMMANDDEFINE argv[0]

int getIndex(char, char*);
char* fileGetName(char*);
void move(char*, char*);
void copy(char*, char*);
int main(int argc, char** argv)
{


    printf("Test Argc: %d\n", argc);
    int lengthArray = argc-2;
    printf("Test Length: %d\n", lengthArray);
    
    printf(" command %s\n", COMMANDDEFINE);


    printf("%s\n", DESTDEFINE);

    if(strcmp("./copy", COMMANDDEFINE) == 0)
    {
        // copy(source, dest);
    }
    else if(strcmp("./move", COMMANDDEFINE) == 0)
    {
    
        int i = 1;
    
printf("Test 1: %s\n", argv[i]);
printf("Test 2: %s\n", argv[argc-1]);
    
    move(SOURCEDEFINE, DESTDEFINE);
        printf("%s Filename debug \n", SOURCE2DEFINE);
    move(SOURCE2DEFINE, DESTDEFINE);
    //  i++;
}
return 0;
}


void moveMultiple(int argc, char** argv){
        int index = 1;
        while(argv[index] != NULL){
            if(index < argc  - 1){
                move(argv[index],argv[argc - 1]);
                index++;
            }

        }

}

void move(char *source, char* dest)
{
    printf("Running Move\n");

  // FILE *s = fopen(source, "r");
//  FILE *s;

    //FILE *s = fopen(source, "r");
    strcat(dest, fileGetName(source));

int l = link(source, dest);
    //if(s == NULL)
        if(l)
    {

        printf("Error, File Not Found");
                perror("Link");
        fflush(stdout);
        exit(1);
    }
remove(source);

}

void copy(char *source, char* dest)
{
    printf("Running Copy\n");

    strcat(dest, fileGetName(source));


int l = link(source, dest);
    //if(s == NULL)
        if(l)
    {

        printf("Error, File Not Found");
                perror("Link");
        fflush(stdout);
        exit(1);
    }
}


char* fileGetName(char *filename)
{
int i = 0;

int length = strlen(filename);

char *catString;
int index = getIndex('/', filename);
index--;
memcpy(catString,&filename[index], length);
return catString;
}


int getIndex(char i, char *s)
{
    printf("Running getIndex\n");
      int index = -1;
      for(int l =0; l<strlen(s); l++){
                         if(s[l] == i) {
                  index = l;
             }
      }
      return index;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

Bonjour°[大白 2025-01-26 16:07:26

您的移动方法更改dest(它确实是argv [i]),并在其之后覆盖内存:strcat(dest,filegetName(source)); <<< /代码>。这会破坏其他参数,可能是其他一些内容。不要将字符串写入您不拥有的记忆中。

Your move method changes dest (which is really argv[i]), and overwrites the memory after it: strcat(dest, fileGetName(source));. This destroys the other parameter and probably some other things. Don't write strings into memory you don't own.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文