输出系统()在一行C中

时间:2018-03-13 07:12:21

标签: c linux gcc

我已经尝试了几个小时来创建一个程序,通过运行如下命令来输出类似command[/home/nerdofcode/]:的内容: printf("Command[", system("pwd"),"]: "); ...

但我收到的问题是,当我输入输入时,它开始在command[...输入,然后一旦我点击回车,它最终会输出system("pwd"); ......

技术信息

我正在使用system()函数在Linux上执行系统命令。

2 个答案:

答案 0 :(得分:1)

要正确使用printf作为以null结尾的字符串,您需要更改参数:

printf("Command[%s]: ", string_with_result);

为了正确获取string_with_result,您需要研究system()在您的环境中的工作方式。它的返回值是特定于实现的,因此不允许使用满足您需要的代码来回答。

char * string_with_result; /* pointer to null-terminated sequence of char */

这是上面提出的printf中使用的字符串结果的声明。

如果您想获得结果,但不坚持使用system(),请检查此StackOverflow问题并接受答案:
'pwd' to get path to the current file

这个Q / A可能是" unix-ish"实际使用system()的环境,它使用popen()
C: Run a System Command and Get Output?

答案 1 :(得分:1)

printf无法作为" concat"逗号分隔字符串的操作。它有一个带占位符的格式字符串和占位符的参数。

所以你可以写:

import UIKit;

class LoginScreenViewController: UIViewController {
    @IBOutlet weak var loginMenu: UIView!;

    override func viewDidLoad() {
        super.viewDidLoad();

        NotificationCenter.default.addObserver(
            self,
            selector: #selector(keyboardWillChange(notification:)),
            name: .UIKeyboardWillChangeFrame,
            object: nil
        );
    }

    override func viewWillDisappear(_ animated: Bool) {
        NotificationCenter.default.removeObserver(self);
    }

    @objc func keyboardWillChange(notification: Notification) {
        let keyboardHeight = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.height;
        UIView.animate(withDuration: 0.5, animations: { () -> Void in
            self.loginMenu.frame.origin.y = UIScreen.main.bounds.height - keyboardHeight - self.loginMenu.frame.height;
        });
    }
}

但是下面的代码不会连接两个字符串;它宁愿将char *s1 = "hello", *s2 = "world"; printf("%s %s", s1, s2); 视为格式字符串(没有占位符),也会忽略参数:

s1

进一步注意char *s1 = "hello", *s2 = "world"; printf(s1, s2); 不会返回一个字符串,您可以在int system(const char* cmd)中使用该字符串。所以我建议写。

printf

只要printf("Command["); system("pwd"); printf("]: "); - 命令和您的程序system stdout`定位到相同的输出流,这应该可以在控制台上运行。