我正在尝试编写一个解析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;
}
答案 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
,但不要忘记释放已分配的内存)