【问题标题】:Double Pointer char Operations双指针字符操作
【发布时间】:2012-03-25 13:53:14
【问题描述】:

假设我有char **argv

首先,如何打印出argv 中的所有字符串?我尝试了以下方法:

char *temp;
temp = *argv; // Now points to the first string?
while (temp != NULL) {
    printf("%s ", temp);
    temp++;
}

在这里,当temp 增加时,它只跳过一个字符。为什么会这样?我知道argv 是一个包含点的数组。每个指针都指向char* 的数组。如果是这样,为什么这不起作用?我知道因为tempchar 类型,增加该指针会增加1 字符(或字节)。如果是这样,我怎样才能将指针增加到下一个数组并打印出该字符串?

【问题讨论】:

    标签: c arrays string argv


    【解决方案1】:

    它只跳过一个字符,因为temp 是指向char 的指针。通过添加一个,您告诉编译器将指针移动到内存中的下一个char

    argv 是一个指针数组。您需要做的是在每次迭代中移动到下一个指针。比如:

    char **temp = argv;  // temp is a pointer to a *pointer*, not a pointer to a *char*
    while (*temp != NULL) {
        printf("%s ", *temp);
        temp++;
    }
    

    【讨论】:

      【解决方案2】:

      您需要增加argv,而不是*argv。使用本地副本,如下所示:

      for (char ** p = argv; *p; ++p)      // or "*p != NULL"
      {
          char * temp = *p;                // now points to the first string!
          printf("%s ", temp);             // or just "printf("%s", *p);"
      }
      

      【讨论】:

      • argv 的最后一个元素是否为空?我希望这会在数组的末尾运行。
      • @CollinHockey:是的,标准要求它。请参阅 C99 标准的 5.1.2.2.1。
      • @CollinHockey:按照 OP 的失败尝试,我认为是这样,而且还因为看不到其他明显的终止条件。 Oli:OP 没有说我们正在处理标准的 main 参数,但我们都假装我们在处理。
      • @OliCharlesworth 很高兴知道。我以为他在 main 的某个地方使用了标准的 argv/argc 对。
      • 不处理标准主参数,但它是 NULL 终止的。
      【解决方案3】:

      首先,您需要了解char** argv 是什么。它是一个指向 char 的指针数组。此数组中的指针不一定位于地址空间中彼此靠近的任何位置。你想要的是这样的:

      char** temp;
      temp = argv;
      while(temp != argv + argc) {
          printf("%s ", temp);
          temp++;
      }
      

      你需要有一个指向数组第一个元素的指针,指向 char 的指针。而是增加它。

      【讨论】:

      • 没有argc。这不是标准的主要论点。
      【解决方案4】:

      您必须增加 argv 而不是 *argv。请注意,如果您的 argvmain 函数的参数,则它是可修改的,您可以像这样使用它:

          while (*argv++) {
              printf("%s\n", *argv);
          }
      

      【讨论】:

      • 如果他只需要打印字符串值,这是最紧凑的形式。
      【解决方案5】:

      你可能想做的是:

      char* a = argv[0];  // first arg
      char* b = argv[1];  // second arg
      char* c = argv[2];  // third arg
      

      相当于这个:

      char* a = *(argv + 0);
      char* b = *(argv + 1);
      char* c = *(argv + 2);
      

      然后您希望将其概括为一个循环。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多