如何将所有命令行参数连接在一起并打印出结果值?

时间:2014-07-09 02:58:57

标签: c string-concatenation argv argc

我无法弄清楚如何将文件路径与字符串连接起来。用户在命令提示符中输入字符串,如下所示:

    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;
    }

我希望我能清楚地解释清楚。

2 个答案:

答案 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;
} 

我希望知道这一点很清楚。