SORU
17 AĞUSTOS 2009, PAZARTESİ


String ve char arasındaki fark[] C türleri

Biraz C biliyorum ve C-şöyle bir göz atacağım şimdi . C dize ile ilgili diziler char alışkınım, ama C kodu bakarken örnekleri dize türü ve char dizileri kullanarak görüyorum:

#include <iostream>
#include <string>
using namespace std;

int main () {
  string mystr;
  cout << "What's your name? ";
  getline (cin, mystr);
  cout << "Hello " << mystr << ".\n";
  cout << "What is your favorite team? ";
  getline (cin, mystr);
  cout << "I like " << mystr << " too!\n";
  return 0;
}

ve

#include <iostream>
using namespace std;

int main () {
  char name[256], title[256];

  cout << "Enter your name: ";
  cin.getline (name,256);

  cout << "Enter your favourite movie: ";
  cin.getline (title,256);

  cout << name << "'s favourite movie is " << title;

  return 0;
}

(her ikisi de http://www.cplusplus.com örnekler)

Bu bir yaygın soruldu ve cevaplandı (açık?) sanırım soru, ama güzel olurdu eğer birisi bana söylersin ne tam olarak arasındaki fark bu iki şekilde başa çıkmak için bazı dizeleri C (performans, API entegrasyonu, her bir tanesi, ...).

Teşekkür ederim.

CEVAP
17 AĞUSTOS 2009, PAZARTESİ


Char bir dizi sadece bu karakter dizisi

  • Eğer yığın (sizin örnekte olduğu gibi) ayrılan varsa, her zaman örnek edinecektir. 256 içerdiği metne ne kadar bayt
  • Eğer öbek üzerinde ayrılmış (malloc kullanarak() veya new char[]) daha sonra bellek serbest bırakmak için sorumlu sensin ve her zaman bir yığın ayırma yükü olacak.
  • Eğer diziye 256'dan fazla karakter bir metin kopyalamak için, çirkin onaylama mesajları kazasında üretmek veya (yanlış)davranış programınızı başka bir yerde açıklanamayan neden olabilir.
  • Metnin uzunluğunu belirlemek için, dizi taranacak, karakter karakter, \0 karakteri vardır.

Bir dize char bir dizi içerir, ama sizin için otomatik olarak yöneten bir sınıftır. En dize uygulamaları dahili 16 karakter (çok kısa dizeleri yığını parçası yok) dizi ve uzun dizeleri için yığın kullanın.

Böyle bir dize karakter dizisi erişebilirsiniz:

std::string myString = "Hello World";
const char *myStringChars = myString.c_str();

C dizeleri \0 karakteri gömülü içerir, sayma olmadan uzunlukları biliyorum, öbek ayrılan daha kısa metinler için dizileri char ve arabellek taşmaları sizi koruyabilir. Ayrıca daha okunaklı ve kullanımı daha kolaydır.

-

Ancak, C dizeleri (çok) uygun kullanım boyunca DLL sınırlar, çünkü bu gerekli, herhangi bir kullanıcı böyle bir DLL işlevi olduğuna emin kullanarak aynı derleyici ve C çalışma zamanı uygulaması, diye o riski onun string sınıfı farklı davranıyor.

Normalde bir string sınıfı da tek bir paylaşılan kullanıyorsanız hafıza yeniden açmak mümkün olacak bu yüzden arama öbek öbek belleği serbest bırakır ... (.dll veya .EE) çalışma zamanı sürümü.

Kısacası: tüm iç fonksiyonları ve yöntemleri, C dizeleri. Hiç yazma .dll veya .bu yüzden, (yani maruz dll/) genel işlevleri C dizeleri kullanın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jason Parker

    Jason Parker

    14 Aralık 2009
  • nigahiga

    nigahiga

    21 Temmuz 2006
  • olinerd

    olinerd

    23 AĞUSTOS 2007