1

所以这就是程序应该做的事情:通过键入限制来限制应用程序在 Mac 上打开。它应该允许通过使用与以前相同的名称再次键入restrict 来访问应用程序。

程序正在做什么:限制应用程序工作正常。但是当我再次输入限制时,它会出现以下输出:

CandyBar
\277_\377CandyBar
\277_\377Restricting application
chmod: /Applications/CandyBar
\277_\377.app: No such file or directory
chown: /Applications/CandyBar
\277_\377.app: No such file or directory
chmod: /Applications/CandyBar
\277_\377.app: No such file or directory

如您所见,它将字符添加到\277_\377字符串的末尾。这是我的源代码:

for (int i = 0; strlen(argument) + 14 >= i; i++) {
    argument[i] = '\0';
}
cout << argument;

getArguments();
argument[strlen(argument) - 1] = '\0';
cout << argument;
string application(argument);
cout << application;
if (!restrictedApplication[application]) {
    restrictedApplication[application] = false;
}
if (restrictedApplication[application] == false) {
    cout << "Restricting application\n";
    restrictedApplication[application] = true;
    string fullCommand =
        "chmod -x '/Applications/" + application + ".app';" + 
        "chown root '/Applications/" + application + ".app';" + 
        "chmod 000 '/Applications/" + application + ".app'";
    char fullCommandChar[256];
    for (int i = 0; fullCommand[i] != '\0'; i++) {
        fullCommandChar[i] = fullCommand[i];
    }
    system(fullCommandChar);
}
else {
    cout << "Restoring application\n";
    restrictedApplication[application] = false;
    string fullCommand =
        "chmod +x '/Applications/" + application + ".app';" +
        "chown jamespickering '/Applications/" + application + ".app';" +
        "chmod 777 '/Applications/" + application + ".app'";
    char fullCommandChar[256];
    for (int i = 0; fullCommand[i] != '\0'; i++) {
        fullCommandChar[i] = fullCommand[i];
    }
    system(fullCommandChar);
}
4

2 回答 2

5

这可能是因为它正在寻找\0字符串末尾的字符,但它从未收到它。

我还没有深入研究您的代码,但我看到您正在尝试在这里执行此操作。

argument[strlen(argument) - 1] = '\0';

当我发现\0事情变得混乱时,我会编辑我的帖子,因为这就是产生奇怪的原因

\277_\377输出。


编辑:

for (int i = 0; strlen(argument) + 14 >= i; i++) {
     argument[i] = '\0';
}

你想用这部分代码做什么?

这本质上是循环并添加\0fromindex 0length of the string plus 14to 参数。这应该传递参数的数组大小,对吗?有人可以解释这甚至可以显示输出吗?

于 2013-08-30T19:49:44.793 回答
1

这里:

for (int i = 0; strlen(argument) + 14 >= i; i++) {
    argument[i] = '\0';
}
cout << argument;

您将第一个元素设置argument0,然后尝试输出它。你到底想输出什么?当你这样做时,你清空了字符串。

于 2013-08-30T20:58:06.633 回答