How to center a listing?

I know some strange solutions involving saving the content temporary to a box and then determing the text width.

The simplest solution is to use a tabular environment:

\begin{center}
\begin{tabular}{c}
\begin{lstlisting}[...]
...
\end{lstlisting}
\end{tabular}
\end{center}

However, this doesn't center the caption. Making the caption centering correctly above the listing requires another solution. We have to take the caption out of the listings environment; this is done by a figure (or another floating environment).

Here's a way to center both your listing and the caption:

\documentclass{article}
\usepackage{listings}
\renewcommand{\figurename}{Listing}
                    % replace figurename with the text that should preceed the caption
\begin{document}

\begin{figure}[thp] % the figure provides the caption
\centering          % which should be centered
\caption{Ausgabe des C-Programms}
\begin{tabular}{c}  % the tabular makes the listing as small as possible and centers it
\begin{lstlisting}[label={gtt_c_ausgabe}]
a  |  b  |  q  |  u  |  s  |  v  |  t
----------------------------------------
78 |  21 |   1 |     |   1 |   1 |  -1
21 |  15 |   3 |   1 |  -3 |  -1 |   4
15 |   6 |   1 |  -3 |   4 |   4 |  -5
 6 |   3 |   2 |   4 | -11 |  -5 |  14
 3 |     |   2 | -11 |  26 |  14 | -33
----------------------------------------
\end{lstlisting}
\end{tabular}
\end{figure}

\end{document}

The lstlisting package only boxes the contents if it starts in horizontal mode (which is the reason why it boxes the contents in a tabular).

A solution is to coerce horizontal mode, but there's the added problem of setting the caption, which can be done with the help of \captionof, persuading LaTeX into thinking this is a listings and not a figure.

In order to have a key-value interface, I set up a new one that intercepts caption and label, while it passes every unknown option to \lstset. The only change is that a short caption should be specified as a value to shortcaption and not with the

caption=[short caption]{long caption}

format of listings.

\documentclass{article}
\usepackage{showframe} % just for testing
\usepackage{listings,caption,xparse}

\ExplSyntaxOn
\tl_new:N \l_listings_boxed_options_tl
\keys_define:nn { listings/boxed }
 {
  caption .tl_set:N = \l_listings_boxed_caption_tl,
  shortcaption .tl_set:N = \l_listings_boxed_shortcaption_tl,
  label .tl_set:N = \l_listings_boxed_label_tl,
  unknown .code:n =
          \tl_put_right:NV \l_listings_boxed_options_tl \l_keys_key_tl
          \tl_put_right:Nn \l_listings_boxed_options_tl { = #1 , },
 }
\box_new:N \l_listings_boxed_box

\lstnewenvironment{blstlisting}[1][]
 {
  \keys_set:nn { listings/boxed } { #1 }
  \exp_args:NV \lstset \l_listings_boxed_options_tl
  \hbox_set:Nw \l_listings_boxed_box
 }
 {
  \hbox_set_end:
  \cs_set_eq:cc {c@figure} {c@lstlisting}
  \tl_set_eq:NN \figurename \lstlistingname
  \tl_if_empty:NF \l_listings_boxed_caption_tl
   {
    \tl_if_empty:NTF \l_listings_boxed_shortcaption_tl
     {
      \captionof{figure}{\l_listings_boxed_caption_tl}
     }
     {
      \captionof{figure}[\l_listings_boxed_shortcaption_tl]{\l_listings_boxed_caption_tl}
     }
    \tl_if_empty:NF \l_listings_boxed_label_tl { \label{\l_listings_boxed_label_tl} }
   }
  \leavevmode\box_use:N \l_listings_boxed_box
 }
\ExplSyntaxOff

\begin{document}
\begin{center}
\begin{blstlisting}[
  caption=Ausgabe des C-Programms,
  shortcaption=Ausgabe, % just for showing the syntax, it can be omitted
  label=ggt_c_ausgabe,
  basicstyle=\ttfamily, % just for testing the option is correctly passed
]
a  |  b  |  q  |  u  |  s  |  v  |  t  
----------------------------------------
78 |  21 |   1 |     |   1 |   1 |  -1 
21 |  15 |   3 |   1 |  -3 |  -1 |   4 
15 |   6 |   1 |  -3 |   4 |   4 |  -5 
 6 |   3 |   2 |   4 | -11 |  -5 |  14 
 3 |     |   2 | -11 |  26 |  14 | -33 
----------------------------------------
\end{blstlisting}
\end{center}
\end{document}

enter image description here