std::cout 和printf
时间: 2023-11-22 07:46:23 浏览: 89
std::cout和printf都是用于输出的函数,但是它们有一些不同之处。std::cout是C++标准库中的一个输出流对象,使用时需要加上std::前缀,而printf是C语言中的一个输出函数,使用时需要包含头文件stdio.h。另外,std::cout使用<<运算符进行输出,而printf使用格式化字符串进行输出。相比之下,std::cout更加类型安全,可以直接输出各种类型的数据,而printf需要根据不同的类型使用不同的格式化字符串。此外,std::cout还支持链式输出,可以在一行中输出多个数据,而printf需要多次调用才能输出多个数据。总的来说,std::cout更加方便、易用、安全,而printf则更加灵活、强大、可定制化。
相关问题
如下代码为何在arm芯片上运行发生crash :#include <iostream> #include <deque> #include <memory> #include <stdio.h> using namespace std; class Buffer { public: Buffer(int size) { m_buffer = new char[size]; printf("malloc %d size space\n", size); } ~Buffer() { if (m_buffer) { delete [] m_buffer; } std::cout<<"buffer xigou"<<std::endl; } Buffer(Buffer&& buffer) { std::cout<<"yidong gouzao"<<std::endl; this->m_buffer = buffer.m_buffer; buffer.m_buffer = nullptr; } private: char* m_buffer; }; class Log { public: Log() { } ~Log() {std::cout<<"xigou"<<std::endl;}; void init() { m_deque.push_back(std::unique_ptr<Buffer>(new Buffer(128))); m_deque.push_back(std::unique_ptr<Buffer>(new Buffer(256))); m_deque.push_back(std::unique_ptr<Buffer>(new Buffer(512))); } void test() { init(); std::cout<<"test ------"<<std::endl; std::unique_ptr<Buffer> tp = nullptr; tp = std::move(m_deque.front()); int i = 1; for (auto it = m_deque.begin() ; it != m_deque.end(); it++) { if (*it == nullptr) { std::cout<<"nullptr "<<i<<std::endl;; } i++; } m_deque.pop_front(); std::cout<<"end -------"<<std::endl; } private: std::deque<std::unique_ptr<Buffer>> m_deque; }; int main() { std::cout << "Hello World!\n"; Log my_log; cout<<"start Log test"<<endl; my_log.test(); cout<<"end Log test"<<endl; }
这段代码在 ARM 芯片上崩溃的原因可能是因为在 ARM 架构中,对于未初始化的指针,其默认值是一个非法地址,而在 x86 架构中,对于未初始化的指针,其默认值为 NULL。在这段代码中,当 m_deque 中的指针被移动(std::move)后,其原来的位置被设置为 nullptr,但是在迭代器遍历时,可能会遇到这些被设置为 nullptr 的指针,导致程序崩溃。
因此,你可以在遍历时加上一个判断,判断当前指针是否为 nullptr,如果是,则跳过该指针的遍历。例如:
```
for (auto it = m_deque.begin(); it != m_deque.end(); it++) {
if (*it == nullptr) {
continue;
}
// ...
}
```
以上代码用printf()代替 std::cout << "..." << std::endl; 之后的代码完整的给我
将`std::cout`替换为`printf()`函数后,上述代码可能会像这样变化:
```cpp
#include <cstdio> // 替代了<iostream>中的std::cout
class InventorySystem {
public:
// ... 其他成员保持不变 ...
void create_salesman(int initial_stock) {
printf("请输入售货员姓名:\n");
scanf("%s", salesman.c_str());
printf("请输入产品名称:\n");
scanf("%s", product_name.c_str());
stock = initial_stock;
}
// ... 其他函数保持不变 ...
void quit() {
printf("程序已结束。\n");
}
};
int main() {
InventorySystem system;
while (true) {
int input;
printf("请选择操作(1-创建售货员, 2-卖出商品, 3-随机卖出, 4-查看信息, 5-退出): ");
scanf("%d", &input);
switch (input) {
case 1: system.create_salesman(100); break;
case 2: system.sell(scanf("%d", &input)); break;
case 3: system.random_sell(); break;
case 4: system.view_info(); break;
case 5: system.quit(); return 0;
default: printf("无效输入。\n");
}
}
return 0;
}
```
在这个版本中,`printf()`函数用于输出文本字符串,`scanf()`函数用于接收用户输入的数据。`%s`用于字符串输入,`%d`用于整型输入。需要注意的是,当使用`scanf()`时,需要提供指向变量的地址,例如`scanf("%d", &input)`。
阅读全文