我无法弄清楚如何将文件路径与字符串连接起来。用户在命令提示符中输入字符串,如下所示:
StringLabMain.exe Mary had a little lamb 1234
它应该打印出这样的东西:
Concatenated arguments: d:\Documents and Settings\labadmin\My Documents\Visual Studio 2012\Projects\test\debug\StringLabMain.exeMaryhadalittlelamb1234
但我的代码打印出来:
Concatenated arguments: StringLabMain.exeMaryhadalittlelamb1234
这是我的代码(我不明白连接如何工作以包含带字符串的文件路径):
int main(int argc, char *argv[])
{
int i;
for (i = 0; i < argc; i++)
{
printf("%s", argv[i]);
}
return 0;
}
我希望我能清楚地解释清楚。
答案 0 :(得分:0)
以下代码演示了如何使用strcat()构建所有argv []元素的字符串:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
int i;
size_t outputSize = 1;
char *output = NULL;
/* Allocate a buffer large enough to hold the string termination character. */
output=malloc(outputSize);
if(!output)
{
fprintf(stderr, "malloc() failed.\n");
goto CLEANUP;
}
*output = '\0';
/* Iterate argv[] elements. */
for(i = 0; i < argc; i++)
{
char *tmp;
/* Increase the size of the output buffer to hold this argv[] element. */
outputSize += strlen(argv[i]);
tmp=realloc(output, outputSize);
if(!tmp)
{
fprintf(stderr, "realloc() failed.\n");
goto CLEANUP;
}
output=tmp;
/* Concatinate this argv[] element to the output string. */
strcat(output, argv[i]);
}
/* Print the result. */
printf("%s\n", output);
CLEANUP:
if(output)
free(output);
return 0;
}
在Linux上,您还可以包含当前工作目录的路径,如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int i;
size_t outputSize;
char *output = NULL;
output=getcwd(NULL,0);
if(!output)
{
fprintf(stderr, "getcwd() failed.\n");
goto CLEANUP;
}
outputSize = strlen(output) + 1;
for(i = 0; i < argc; i++)
{
char *tmp;
outputSize += strlen(argv[i]);
tmp=realloc(output, outputSize);
if(!tmp)
{
fprintf(stderr, "realloc() failed.\n");
goto CLEANUP;
}
output=tmp;
strcat(output, argv[i]);
}
printf("%s\n", output);
CLEANUP:
if(output)
free(output);
return 0;
}
上面的示例是特定于Linux的,因为Linux扩展为&#39; getcwd()&#39;。 Linux getcwd手册页指出:
作为POSIX.1-2001标准的扩展,如果buf为NULL,则Linux(libc4,libc5,glibc)getcwd()使用malloc(3)动态分配缓冲区。在这种情况下,分配的缓冲区具有长度大小,除非size为零,当buf根据需要分配时。调用者应释放(3)返回的缓冲区。
显然,_getcwd()在MS Windows上的工作方式相同。关于_getcwd()的MSDN states:
_getcwd函数获取默认驱动器的当前工作目录的完整路径,并将其存储在缓冲区中。整数参数maxlen指定路径的最大长度。如果路径的长度(包括终止空字符)超过maxlen,则会发生错误。 buffer参数可以为NULL;使用malloc自动分配至少大小为maxlen的缓冲区(仅在必要时更多)以存储路径。稍后可以通过调用free并传递_getcwd返回值(指向已分配缓冲区的指针)来释放此缓冲区。
因此,以下(未经测试的)代码可能适用于MS Windows环境:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <direct.h>
int main(int argc, char *argv[])
{
int i;
size_t outputSize;
char *output = NULL;
output=_getcwd(NULL,0);
if(!output)
{
fprintf(stderr, "_getcwd() failed.\n");
goto CLEANUP;
}
outputSize = strlen(output) + 1;
for(i = 0; i < argc; i++)
{
char *tmp;
outputSize += strlen(argv[i]);
tmp=realloc(output, outputSize);
if(!tmp)
{
fprintf(stderr, "realloc() failed.\n");
goto CLEANUP;
}
output=tmp;
strcat(output, argv[i]);
}
printf("%s\n", output);
CLEANUP:
if(output)
free(output);
return 0;
}
答案 1 :(得分:0)
首先,如果您的唯一目的是打印目录和连接的args,那么您只需要在主循环之前打印当前目录。这可以使用getcwd()完成。
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int i;
printf("%s", getcwd(0,0));
for (i = 0; i < argc; i++)
{
printf("%s", argv[i]);
}
return 0;
}
但是出于更一般的目的,我真的建议你使用stracat()来连接字符串。因此,您必须使用当前工作目录声明“string”(使用char *),然后连接args。这将以这种方式完成:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
char* toPrint;
int i;
toPrint = getcwd(0,0);
for (i = 0; i < argc; i++)
strcat (toPrint, argv[i]);
printf("%s\n",toPrint);
return 0;
}
我希望知道这一点很清楚。