C++制表符显示问题

我在Ubuntu下编写了如下程序,使用制表符:

cout << "Please enter one of the following choices: " << endl;
cout << "c) carnivore\tp) pianist." << endl
         << "t) tree\tg) game" << endl;

并获得了如下输出

Please enter one of the following choices: 
c) carnivore    p) pianist.
t) tree g) game

但我希望获得如下格式的输出:

Please enter one of the following choices:
c) carnivore    p) pianist
t) tree         g) game

想问一下我的问题出在哪里,万分感谢。

该回答引用GPT:
你的问题可能是因为没有设置正确的制表符宽度,导致输出的格式不正确。可以使用setw函数来设置制表符的宽度,如下所示:

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    cout << "Please enter one of the following choices: " << endl;
    cout << setw(20) << "c) carnivore" << setw(20) << "p) pianist." << endl
         << setw(20) << "t) tree" << setw(20) << "g) game" << endl;
    return 0;
}

运行上面的代码,可以得到如下输出:

Please enter one of the following choices:
c) carnivore p) pianist.
t) tree g) game
如还有疑问,可留言帮助解决。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/168585
  • 这篇博客也不错, 你可以看下c++阶乘递归数据溢出的问题及解决办法
  • 同时,你还可以查看手册:linux unexpand 将每个空格转换为制表符,将产生的输出写入标准输出。 中的内容
  • 除此之外, 这篇博客: C++面试题汇总 操作系统中的 线程间的同步方式,最好说出具体的系统调用 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 信号量

      • 信号量是一种特殊的变量,可用于线程同步。它只取自然数值,并且只支持两种操作:
        • P(SV):如果信号量SV大于0,将它减一;如果SV值为0,则挂起该线程。
        • V(SV):如果有其他进程因为等待SV而挂起,则唤醒,然后将SV+1;否则直接将SV+1
      • 其系统调用为:
        • sem_wait(sem_t *sem): 以原子操作的方式将信号量减1,如果信号量值为0,则sem_wait将被阻塞,直到这个信号量具有非0值。
        • sem_post(sem_t *sem): 以原子操作将信号量值+1。当信号量大于0时,其他正在调用sem_wait等待信号量的线程将被唤醒。
    • 互斥量

      • 互斥量又称互斥锁,主要用于线程互斥,不能保证按序访问,可以和条件锁一起实现同步。
        • 当进入临界区时,需要获得互斥锁并且加锁;
        • 当离开临界区时,需要对互斥锁解锁,以唤醒其他等待该互斥锁的线程。
      • 其主要的系统调用如下:
        • pthread_mutex_init:初始化互斥锁
        • pthread_mutex_destroy:销毁互斥锁
        • pthread_mutex_lock:以原子操作的方式给一个互斥锁加锁,如果目标互斥锁已经被上锁,pthread_mutex_lock调用将阻塞,直到该互斥锁的占有者将其解锁。
        • pthread_mutex_unlock:以一个原子操作的方式给一个互斥锁解锁。
    • 条件变量

      • 条件变量,又称条件锁,用于在线程之间同步共享数据的值。
      • 条件变量提供一种线程间通信机制:
        • 当某个共享数据达到某个值时,唤醒等待这个共享数据的一个/多个线程。
        • 当某个共享变量等于某个值时,调用 signal/broadcast。此时操作共享变量时需要加锁。
      • 其主要的系统调用如下:
        • pthread_cond_init:初始化条件变量
        • pthread_cond_destroy:销毁条件变量
        • pthread_cond_signal:唤醒一个等待目标条件变量的线程。哪个线程被唤醒取决于调度策略和优先级。
        • pthread_cond_wait:等待目标条件变量。需要一个加锁的互斥锁确保操作的原子性。该函数中在进入wait状态前首先进行解锁,然后接收到信号后会再加锁,保证该线程对共享资源正确访问。

      • 这玩意儿是个坑, 一个条件变量可以被signal唤醒,也可以被broadcast唤醒, 所以我们使用它的时候要配合while循环弄一个重陷入机制, 在stl中的condition_variable的底层就是这个