【问题标题】:Writing argv[] through write()通过 write() 写入 argv[]
【发布时间】:2014-03-17 08:19:49
【问题描述】:

这里有点问题。我正在尝试写出用户输入 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,我在屏幕上的输出是...

你的文件名:stackoverflowXDG_VTNR=7SSH_AGENT_PID=1733XDG_SESSION_ID=c2CLUTTER_IM_MODULE=ximSESSION=ubuntuGPG_AGam@am-GA-880GM-UD2H:~$

它不应该简单地显示 yourfilenameis:stackoverflow

【问题讨论】:

    标签: c unix terminal


    【解决方案1】:

    你需要使用string.h

    例如,strlen 将解决您的打印问题:

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

    之所以出现此问题,是因为您专门从 argv[1] 打印 100 字节,这是未定义的行为。

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

    #include <string.h>
    
    int main(int argc, char* argv[]){
        char o[100] = "Your File Name: ";
        strcat(o, argv[1]);
        write(1, o, strlen(o));
        return 0;
    }
    

    【讨论】:

    • 存在一个潜在的安全问题:argv[1]的大小可能超过100。使用strcat(o, argv[1])之前最好检查一下argv[1]的大小, 或使用 strcat(o, argv[1], sizeof(o)-strlen(o)-1);
    【解决方案2】:

    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() 更明智。

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 2014-12-14
      • 2014-06-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多