【问题标题】:shell scripting: write to fileshell脚本:写入文件
【发布时间】:2016-02-13 16:34:25
【问题描述】:

我必须接受命令:echo 'slkdjf' > filename 所以用户输入“echo”,他们想要输入的字符串,以及他们想要输入的文件名。我将如何用 C 编写来接收这些命令。

这是我到目前为止所做的。

int main(int argc, char* argv[])
{
    int j = 0
    int i = 6
    char buff[100];
    FILE * fp;

    if(argv[0] == 'e' && argv[1] == 'c' && argv[2] == 'h' &&
       argv[3] == 'o' && argv[4] == ' ' && argv[5] == '''){
            while(argv[i] != '''){
                    buff[j] = argv[i];
                    i++;
                    j++;
            }
    }
    fp = fopen("\proc\hello\hello", "w");
    fwrite(buff, 1, sizeof(buff), fp);
    fclose(fp);
}

到目前为止看起来还不错吗?

【问题讨论】:

  • 我不知道。到目前为止它做了什么?它编译吗?它执行吗?如果它确实执行了,它的行为是否出乎意料?
  • 这只是一个大概的理解。我还没有编译它或任何东西。只是想知道我是否走在正确的轨道上
  • 您似乎误解了argv 数组的工作原理。它是一个字符串数组,即以空字符结尾的字符数组。在尝试编写 shell 之前,多了解一下 C 并熟悉如何处理字符串可能是个好主意。
  • ...你应该检查(使用argc)你的程序在尝试使用它们之前收到了多少参数
  • ... 如果您要复制到buff 的参数长于您为buff 分配的100 个字节,您认为会发生什么?我不想太粗鲁,但是,正如你所问的......你上面的程序看起来不正确。

标签: c shell scripting


【解决方案1】:

argv[0] == 'e' 首先不好。 argvchar**,所以如果你想将 argv[i] 与某物进行比较,你应该使用 strcmp()
所以,为了测试第一个单词是否是echo,你必须这样做:

if(strcmp(argv[1], "echo") == 0) // argv[0] is your program name
{ //do something }

您还应该注意到argv[i]char*,如果您想复制字符串,可以使用strcpy

int main(int argc, char* argv[])
{
    int j = 0;
    char buff[100];
    FILE * fp;

    if(argc < 2)
    {
        printf("There are not enough arguments\n");
        return 1;
    }

    if(strcmp(argv[1], "echo") == 0) // means you the user typed 'prog_name echo "something"'
    {
        if(argc > 4) // So you have 'prog_name echo "something" > filename'
                     // But you cannot do 'prog_name echo "something" >filename' this way
                     // Because '>filename' will be counted as 1 argument (1 word)
        {
            fp = fopen(argv[4], "w");
            fwrite(argv[2], sizeof(char), strlen(argv[2]), fp);
            fclose(fp);
        }
        else
            printf("Nothing to save\n");
    }

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多