【问题标题】:Basic script in C (String display)C 中的基本脚本(字符串显示)
【发布时间】:2015-05-07 15:25:36
【问题描述】:

我正在尝试在我的服务器上创建一个简单的脚本,基本上我想发送一个字符串并通过系统函数显示它...

    #include <stdio.h>

int main()
{
    char txt[100];
    printf("Insert a text: ");
    fgets(txt, 100, stdin);
    system("echo %s"), txt;
    return 0;
}

现在我没有得到任何字符串,只是 "%s"

知道为什么吗?

【问题讨论】:

  • 首先,system 的行完全不是你想要做的。使用printf,或至少正确的system 语法。其次,您应该查找 script 定义以及它与 C 程序的不同之处。
  • 我必须使用“系统”,因为我想在 linux 中运行一些命令,但要做到这一点,我需要将字符串发送到命令
  • systemecho 将打印到 stdoutprintf 将打印到标准输出。那么有什么区别呢?
  • 你在呼应 %s,所以这就是你所看到的。

标签: c


【解决方案1】:
system("echo %s"), txt;

这不是你想的那样;这是一个计算结果为txt 的表达式。由于评估txt 没有副作用,并且由于您没有在任何地方捕获表达式的结果,因此在system 调用之后添加, txt 基本上没有任何作用。有关 C 中“逗号”运算符的一些信息,请参阅 this question

此外,system 不支持使用printf 样式的格式说明符,因此您的字符串文字中的%s 没有任何特殊含义;正如你所看到的,它会完全按照所写的方式回显。如果您想在运行时构造一个与system 一起使用的命令,则必须使用sprintf 或类似的方法。

【讨论】:

  • 1+ 用于解释实际发生的情况。
【解决方案2】:

system() 的原型是:

int system(const char * command);

来自man 3 system

执行command中指定的shell命令

由此我们可以安全地假设s 指的是一个C-“字符串”。

因此,使用例如snprintf() 准备字符串:

char s[1024];
snprintf(s, 1024 -1, "echo %s", txt); /* -1 for the C-"string"'s 0-terminator */

然后通过它:

system(s);

【讨论】:

  • 快速提问,我可以从命令行获取字符串并将其显示在 snprintf 中,以便将 txt 替换为命令行中的文本吗?
  • @Matt:使用int main(int argc, char ** argv) 访问在启动时通过argcargv 提供给程序的参数。然而,这方面的细节最好进入您可能想提出的另一个问题。
【解决方案3】:

试试这个,而不是system("echo %s"), txt;

printf("%s", txt);

【讨论】:

  • 与op的问题无关
  • @Mekap 为什么?你读过Rght now I'm not getting any string just "%s" 吗?
  • @deviantfan 他愿意执行一个脚本(即一个shell函数)来打印一行。他不想或不需要使用 printf。在做出任何错误假设之前,请仔细阅读问题。
【解决方案4】:

系统语句不会像 printf 那样格式化输出。

建议使用:

#include <stdio.h>
#include <stdlib.h> // system()
#include <string.h> // strcpy(), strcat()

#define BUF_LEN (100)

int main()
{
    char output[10+BUF_LEN] = "echo ";
    char txt[BUF_LEN] = {'\0'};
    printf("Insert a text: ");
    fgets(txt, BUF_LEN, stdin);
    strcat( output, txt );
    system( output );
    return 0;
}

不过,上面的代码效果很好;

请勿在输入字符串中包含任何命令分隔符、分号或其他会被 shell 解释的字符。

【讨论】:

  • 为什么 +10+5 会这样做?
  • 如果我需要将字符串放在中间怎么办?例如 echo [my string] >> text.txt ?
  • +10 .vs.+5?一点额外的空间永远不会伤害。如果场景中间有输入文本,则需要额外的 strcat() 并且初始字符串需要适当地更长。 (并且可能需要在输入文本周围加上 "。
猜你喜欢
  • 2011-12-19
  • 2013-04-05
  • 2021-03-18
  • 2020-03-24
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多