【问题标题】:Why is Windows injecting my directory listing into argv when I use **?为什么当我使用 ** 时 Windows 会将我的目录列表注入 argv?
【发布时间】:2014-07-24 14:43:57
【问题描述】:

主要方法如下:

int main(int argc,char** argv)
{
    std::string expression=argv[1];
    for(int i=2;i<argc;i++)
    {
        expression+=' ';
        expression+=argv[i];
    }
    std::cout << expression << std::endl << std::endl;
    Expression* expr = Expression::build(expression.c_str());
    std::cout << expr->evaluate() << std::endl;
    delete expr;
    return 0;
}

由于某种原因,大多数情况下效果很好,但请参阅以下输入/输出示例:

D:\Tyler\Desktop>a 2**3
2**3

8

D:\Tyler\Desktop>a 2 ** 3
2 10284556_10203827451228798_9031461414658797199_o.jpg 15686-vanille.p3t 18
865-MiraiNikki.p3t 20777-MIRRORSEDGE2AnimatedTheme.p3t [APE] gras.gpl [Irfa
nView] [APE] gras.pal a.exe arboles_FM.png calc.c calc.cpp couch.png deskto
p.ini gras.pal hackzorz log.txt montanas_FM.png p3textractor p3textractor.z
ip PALLET TOWN.bmp PALLET TOWN.png Pokemon FireRed.bak Pokemon FireRed.gba
Pokemon FireRed.ini Pokemon FireRed.zip ROM Hackers GBA Tool Pack roms send
eros_cope.png senderos_FM.png Thumbs.db Tileset0.bmp Tileset0.pal untitled.
bmp untitled.PNG wdps 3

我感觉这是某种 windows 的东西,还是我在这里遗漏了一些关键的东西?

【问题讨论】:

  • 您可以使用GetCommandLine() 而不是argv 来修复您的代码,但请注意,这也将包括可执行文件。 (也就是说,它将返回a 2 ** 3 而不是2 ** 3。)
  • 我感觉有一种复杂的方法可以让它发挥作用。我猜一些 ifdef 并没有那么可怕,但我讨厌使用 windows.h ;_;感谢您指出这一点,我不知道这是一个实际功能,因为除了奇怪的特定用例之外,它似乎有点不必要。

标签: c++ windows file operating-system argv


【解决方案1】:

** 是许多 shell(包括 windows)中的经典“通配符”。它将替换为当前目录中所有文件的列表。

因此,您可以通过del * 删除所有文件。使用多个 * 与单个 * 相同。

【讨论】:

  • 嗯,我知道单星号,但从未听说双星号是通配符。谢谢! (:
  • 这是不正确的; Windows shell做任何这样的替换。如果合适,可执行文件本身负责这样做。通常这由运行时库处理。
  • 你是说GCC的CRT负责用目录列表替换**?如果是这种情况,那么采用 linux 通配符 [ 一个星号不是更有意义吗? ] 我非常有信心我的代码没有这样做,我尝试运行del **.exe,它运行得很好。当你说它由运行时库处理时,你能解释一下你的意思吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
相关资源
最近更新 更多