【问题标题】:unable to get filename from argv[1] in C无法从 C 中的 argv[1] 获取文件名
【发布时间】:2016-09-27 15:07:42
【问题描述】:

我正在尝试制作一个程序来复制您输入的文件,然后使用相反的文件名(例如 input.txt = txt.tupni)。 我用

开始我的程序
int main(int argc, char **argv) {

当我使用printf("%s",argv[1]) 时,我可以看到已放入的文件名。但是,当我尝试操作它时,我无法让它工作。 char name = argv[1] 不起作用, char name[] = argv[1] 也不起作用

我想要的只是一个 char 数组或一块包含所有字符的 malloc 内存。

【问题讨论】:

  • 您将char[] 分配给char。字符串不能存储在单个字符中。
  • 对于初学者 char name = argv[1] 无法工作,因为您将字符串分配给 char。
  • @trivalent 也许 OP 对 C 来说是新手——没有理由苛刻(尽管阅读 K&R 始终是学习该语言的良好第一步!)
  • @OlivierGrech ..assignig 一个指向字符的指针....
  • 我确实是 C 编程的新手,对此感到抱歉。我在哪里可以找到 K&R,它是什么?感谢您的提示和帮助!

标签: c string input


【解决方案1】:

argvchar ** 类型,所以 argv[1]char * 类型。这就是您要分配给它的变量的类型。

char *name = argv[1];

您不能将name 声明为char [] 并使用char * 对其进行初始化。初始化时只能使用字符串文字。

如果你想复制字符串而不是有另一个指向它的指针,你可以使用strdup,它为复制的字符串分配内存并将其复制过来。

char *name = strdup(argv[1]);

完成后别忘了free

【讨论】:

  • 是的,OP,只要记住“C 风格的字符串”只是一个字符数组,而该数组的名称(标识符 [变量名])是指向其第一个字符的指针字符串(因此类型为char *),在这种情况下,字符串(字符数组)的“名称”是argv[1]。所以,对于argv,你有一个由这些字符串组成的数组,所以argv 本身就是一个指向第一个字符串的指针(它恰好位于相同的位置/与第一个字符串的第一个字符具有相同的内存地址[argv[0]]),这就是为什么 argvchar ** 类型。
  • 另外,OP,不要忘记你不能分配字符串(如果你想要一个副本;它在这种情况下有效,因为name本质上是argv[1]的别名),因此,如果您想要一个具有相同数据的 new 字符串,只要name 足够大,您就可以使用#include <string.h>strcpy(name, argv[1])(或strncpy())。确保有足够的空间容纳空字节。
  • 我前天开始用 C 编程,非常感谢您的帮助和提示!你知道有什么地方可以练习或阅读有关双指针的东西吗?
【解决方案2】:

您需要使用strcpy 之类的函数来完成此操作,并知道字符串长度。

这就是你要做的:

int len = strlen(argv[1])
char *buffer = (char*)malloc(len + 1);
if(buffer != NULL)
{
    strcpy(buffer, argv[1]);
    // copy the file etc.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2021-09-07
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    相关资源
    最近更新 更多