这里有点问题。我正在尝试写出用户输入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
答案 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()
更明智。