Printf () kullanarak bir dizenin kaç karakterinin yazdırılacağını belirlemenin bir yolu var mı?


127

Bir dizenin kaç karakterinin yazdırılacağını belirlemenin bir yolu var mı (s'deki ondalık basamağa benzer int)?

printf ("Here are the first 8 chars: %s\n", "A string that is more than 8 chars");

Yazdırmak ister misiniz: Here are the first 8 chars: A string

Yanıtlar:


226

Temel yol şudur:

printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

Diğer, genellikle daha kullanışlı olan yol şudur:

printf ("Here are the first %d chars: %.*s\n", 8, 8, "A string that is more than 8 chars");

Burada uzunluğu, bir bağımsız değişkenden uzunluğu alma isteği olarak biçimdeki '*' ifadesini kullanan printf () 'ye bir int bağımsız değişkeni olarak belirtirsiniz.

Ayrıca gösterimi de kullanabilirsiniz:

printf ("Here are the first 8 chars: %*.*s\n",
        8, 8, "A string that is more than 8 chars");

Bu aynı zamanda "% 8.8s" gösterimine benzer, ancak yine çalışma zamanında minimum ve maksimum uzunlukları belirlemenize olanak tanır - daha gerçekçi bir senaryoda aşağıdaki gibi:

printf("Data: %*.*s Other info: %d\n", minlen, maxlen, string, info);

POSIX belirtimi printf()bu mekanizmaları tanımlar.


2
Son örneğe: Ya kopyalanan dizge minlen'den daha kısaysa?
truthseeker

4
Çıktı, -belirtilen tam uzunluğa ulaşmak için boş doldurulacaktır (a eklemediğiniz sürece solda ).
Jonathan Leffler

13
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

% 8s, minimum 8 karakterlik bir genişlik belirler. 8'de kesmek istiyorsunuz, bu yüzden% .8s kullanın.

Her zaman tam olarak 8 karakter yazdırmak istiyorsanız,% 8.8s kullanabilirsiniz.


13

Sabit miktarda karakter belirtmenin yanı sıra, şunu da kullanabilirsiniz: *printf, karakter sayısını bir bağımsız değişkenden alır:

#include <stdio.h>

int main(int argc, char *argv[])
{
        const char hello[] = "Hello world";
        printf("message: '%.3s'\n", hello);
        printf("message: '%.*s'\n", 3, hello);
        printf("message: '%.*s'\n", 5, hello);
        return 0;
}

Baskılar:

message: 'Hel'
message: 'Hel'
message: 'Hello'

11

printfYapabilirsin kullanarak

printf("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

C ++ kullanıyorsanız, STL'yi kullanarak aynı sonucu elde edebilirsiniz:

using namespace std; // for clarity
string s("A string that is more than 8 chars");
cout << "Here are the first 8 chars: ";
copy(s.begin(), s.begin() + 8, ostream_iterator<char>(cout));
cout << endl;

Veya daha az verimli:

cout << "Here are the first 8 chars: " <<
        string(s.begin(), s.begin() + 8) << endl;

1
Not: do not kullanmak ostream_iterator<char>(cout)! Bunun yerine kullanın ostreambuf_iterator<char>(cout)! Performanstaki fark oldukça büyük olmalıdır.
Dietmar Kühl

Daha verimli Yolu yerine kullanmak: std::cout.write(s.data(), 8). Veya modern C ++ 'da std::cout << std::string_view{s.data(), 8}.
Artyer

4

İlk dört karakteri yazdırın:

printf("%.4s\n", "A string that is more than 8 chars");

Daha fazla bilgi için bu bağlantıya bakın (.precision -section'ı kontrol edin)


4

C ++ 'da kolaydır.

std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, ""));

DÜZENLEME: Bunu dize yineleyicileriyle kullanmak daha güvenlidir, böylece sondan kaçmazsınız. Çok kısa olan printf ve string ile ne olduğundan emin değilim, ama sanırım bu daha güvenli olabilir.


32
ha, evet bu "kolay". C ++ her zaman araba kazası gibi görünür.
Başkan James K. Polk

hala c ++ 'da printf () yapabilirsiniz :)
StasM

6
Sanırım bu bir alaydı. std::cout << someStr.substr(0,8);çok daha açık.
MSalters

2
@MSalters Bunu bir cevap olarak göndermelisiniz.
Jonathan Mee


1

C ++ 'da bunu şu şekilde yapıyorum:

char *buffer = "My house is nice";
string showMsgStr(buffer, buffer + 5);
std::cout << showMsgStr << std::endl;

Lütfen bunun güvenli olmadığını unutmayın, çünkü ikinci bağımsız değişkeni geçerken dizenin boyutunun ötesine geçebilir ve bir bellek erişim ihlali oluşturabilirim. Bundan kaçınmak için kendi çekinizi uygulamanız gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.