C - 将argv [1]附加到unix PATH的末尾

时间:2015-02-25 13:28:44

标签: c unix

我正在尝试编写一个解析UNIX" PATH"变量,并检查命令行参数文件(argv [1])是否存在于该路径上的任何地址。唯一似乎不起作用的是当我尝试追加' /'到temp,然后将argv [1]附加到那个。在while循环中,temp成为PATH变量的下一个子路径,然后它检查在该路径上是否存在在命令行中输入的文件名。什么是最好的方式来追加' /'到temp的结尾,然后是argv [1]到那个结尾?

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

 void append(char* s, char c)
   {
        int len = strlen(s);
        s[len] = c;
        s[len+1] = '\0';
  }

int main(int argc, char* argv[]){
    const char* path = getenv("PATH");
    char* temp;
    FILE *file;
    char sym = '/';

    temp = strdup(path);
    temp = strtok(temp,":");

    while(temp != NULL){
        printf("%s\n",temp);
        //add "/argv[1]" to temp
        append(sym,temp);
        strcat(argv[1],temp);
        printf("%s",temp);
        file = fopen(temp,"r");
        if(file == NULL){
         printf("ERROR: File \"%s\" does not exist.",temp);
        }
        else{
           printf("Success! File \"%s\" exists.",temp);
        } 
        temp = strtok(NULL,":");
    }

    printf("%s",temp);




     return 0;
}

2 个答案:

答案 0 :(得分:0)

你不应该修改temp,因为你干扰了strtok。 代码的主要问题是管理文件名char字符串的存储。如果要构建一个新的字符串,该字符串是路径,&#39; /&#39;和argv [1]的串联,则需要一个存储空间。最简单的解决方案是使用数组。让它足够长。

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

int main(int argc, char* argv[])
{
    char* path = strdup(getenv("PATH")); // <-- copy the path string
    char* temp;
    FILE *file;
    char fileName[1024]; // <-- Storage for the file name

    temp = strtok(path,":");
    while(temp != NULL)
    {
        printf("temp: %s\n", temp);

        sprintf(fileName, "%s/%s", temp, argv[1]);
        printf("fileName: %s\n", tmp_file);

        file = fopen(fileName,"r");
        if ( file == NULL )
            printf("ERROR: File \"%s\" does not exist.\n", fileName);
        else
            printf("SUCCESS! File \"%s\" exists.\n", fileName);

        temp = strtok(NULL,":");
    }
    free(path); // <-- delete the modified copy of path
    return 0;
}

我们需要复制路径字符串,因为strtok会修改它。它取代了&#39;:&#39;通过&#39; \ 0&#39;。这就是结果的原因。

fileName被定义为一个大数组的char,它可以包含temp /和argv [1]的串联。为了完全正确,我们应该检查strlen(temp)+ 1 + strlen(argv [1])是否&lt; 1024以确保我们没有缓冲区溢出。

sprintf是一个缓冲区的格式化打印,它将为我们进行字符串连接。第一个参数是缓冲区,第二个参数是格式,其余参数是参数。格式是由/字符分隔的两个字符串。

答案 1 :(得分:-1)

这是一个没有&#39;追加&#39;的工作版本。功能:

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

int main( int argc, char* argv[] ) {
    char* path = getenv("PATH");
    char* temp;
    FILE *file;
    char tmp_file[100];

    temp = strtok(path,":");

    while ( temp != NULL ) {
        printf("temp: %s\n", temp);

        sprintf( tmp_file, "%s/%s", temp, argv[1] );
        printf("tmp_file: %s\n", tmp_file);

        file = fopen(tmp_file,"r");
        if ( file == NULL ) {
          printf("ERROR: File \"%s\" does not exist.\n", tmp_file);
        }
        else{
          printf("SUCCESS! File \"%s\" exists.\n", tmp_file);
        }
        temp = strtok(NULL,":");
    }

    return 0;
}

(您可以使用asprintf而不是sprintf,但不要忘记释放已分配的内存)