通过write()编写argv []

时间:2014-02-17 21:03:29

标签: c unix terminal

这里有点问题。我正在尝试写出用户输入argv [1]的数据。我必须使用write()来完成这个。

int main (int argc, char* argv[])
{
  write(1, "Your File Name:", 15);
  write(1, argv[1], 100);
  return 0;
}

以上是我的代码。我真正想要知道的是看看是否可以简单地使用1个将字符串和变量连接在一起的写函数。

使用上述功能时,我会在运行命令时得到更多。例如,如果我输入argv [1]的stackoverflow,我的屏幕输出是......

YourFileName:stackoverflowXDG_VTNR = 7SSH_AGENT_PID = 1733XDG_SESSION_ID = c2CLUTTER_IM_MODULE = ximSESSION = ubuntuGPG_AGam @ am-GA-880GM-UD2H:〜$

不应该只显示你的文件名:stackoverflow

2 个答案:

答案 0 :(得分:0)

您需要使用string.h

例如,strlen将解决您的打印问题超出预期:

write(1, argv[1], strlen(argv[1]));

发生这个问题是因为你专门打印了来自100的{​​{1}}字节而且这是未定义的行为。

关于仅使用一个argv[1]函数,我建议write连接输出。你的代码应该是这样的:

strcat

希望这有帮助!

答案 1 :(得分:0)

POSIX系统的另一个选择是使用writev()

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/uio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    if (argc != 2)
    {
        fprintf(stderr, "Usage: %s filename\n", argv[0]);
        exit(1);
    }
    struct iovec str[] =
    {
        { .iov_base = "Your File Name: ", .iov_len = sizeof("Your File Name: ") - 1 },
        { .iov_base = argv[1],            .iov_len = strlen(argv[1]) },
        { .iov_base = "\n",               .iov_len = 1 },
    };
    enum { NUM_STR = sizeof(str) / sizeof(str[0]) };

    if (writev(STDOUT_FILENO, str, NUM_STR) < 0)
    {
        fprintf(stderr, "Failed to write to standard output\n");
        exit(1);
    }
    return 0;
}

再想一想,使用printf()更明智。