【问题标题】:How to get argv[k] into another string?如何将 argv[k] 放入另一个字符串?
【发布时间】:2016-11-04 19:08:43
【问题描述】:
int main(int argc, char **argv){

   char Q[MAXCHAR];
   Q=argv[k+1];}

Q 是一个数组,而 argv[k+1] 是一个指针。 如何将 argv[k+1] 的内容放入 Q 中?

【问题讨论】:

  • 指针和数组实际上是一回事。你只需要strcpy
  • @Sulthan 指针和数组不一样。在某些情况下,数组会衰减为指针;就是这样。
  • @Sulthan 数组是一个独特的对象类,它通常转换为指针,但不是指针:stackoverflow.com/a/4608421/2757035 数组的名称保留重要信息,主要是数组的sizeof,指针无法传递。因此当然需要在任何地方传递数组大小。
  • @Sulthan:请 (a) 阅读 comp.lang.c FAQ 的第 6 部分,并 (b) 删除您最初的评论。数组是“真正的”指针的错误想法是对 C 语言最常见的误解之一。请不要进一步传播。

标签: c string pointers argv


【解决方案1】:

您可以使用snprintf

snprintf(Q, MAXCHAR, "%s", argv[k]);

(已编辑:第一个版本推荐使用 strncpy)。

【讨论】:

  • strncpy 永远不是您想要的。如果您想要截断副本(本身就是一种可疑的方法),请使用snprintf
  • @melpomene:为什么在这种情况下不推荐strncpy
  • 因为永远不应该使用strncpy。它会做一些奇怪的事情并且命名错误(例如,它不处理 C 字符串,与其他 str* 函数不同)。
  • 我使用了 strncpy 并遇到了很多错误,我将标题包含在内。
  • 如果n 很大但src 很短(这是一种常见情况),victordodon 链接没有提到strncpy 也是不必要的浪费,因为strncpy 总是准确地写入n 字符转换为 dest(如果 src 更短,则写入 '\0')。
【解决方案2】:

您不能直接分配Q = argv[k+1]。对于数组 (Q[MAXCHAR]),arrayname (Q) 是基地址。数组的基地址不能更改。 假设k = 0,您可以使用以下任何方法将 argv[1] 数据获取到 Q 中。

memmove(Q, argv[1], strlen(argv[1]) + 1);

snprintf(Q, strlen(argv[1]) + 1, "%s", argv[1]);

strncpy(Q, argv[1], strlen(argv[1]) + 1);

memcpy(Q, argv[1], strlen(argv[1]) + 1);

sprintf(Q, "%s", argv[1]);

strcpy(Q, argv[1]);

这是程序,它是使用 memmove 输出的:

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

#define MAXCHAR 20

int main(int argc, char **argv)
{
    if (argc < 2) {
        puts("Not enough arguments");
        return -1;
    }
    char Q[MAXCHAR] = {0};

    memmove(Q, argv[1], strlen(argv[1]) + 1);
    puts(Q);
    return 0;
}

输出:

me@linux:~$ ./a.out stackexchange
stackexchange

【讨论】:

    猜你喜欢
    • 2013-03-04
    • 1970-01-01
    • 2012-09-25
    • 2020-05-17
    • 2015-02-11
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多