[]

C++ char tanımlama hatası

üçüncü satırda şu hatayı aldım initializer-string for array of chars is too long.

Tam olarak anlayamadım char bu tip durumlarda yetmiyor mu daha geniş bir tanımlayıcı ile mi tanımlamam lazım.

not:dev-c++ kullanıyorum



int main()
{
**char aa[26]="abcdefghijklmnopqrstuvwxyz";**
char pt[10];
int m,d,q=0,i,j,k[2][2],p[4],pp[4],t[5];
int k1[2][2],k2[2][2],det;

printf("enter the plaintext:" );
scanf("%s",pt);
m=strlen(pt);
printf("enter the numbers:");
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
scanf("%d",&k[i][j]);
}
}

for(i=0;i<m;i++)
{
for(j=i;j<26;j++)

{
if(pt[i]==aa[j])

{
t[q]=j%26;
++q;
}
}
}
p[0]=(k[0][0]*t[0])+(k[0][1]*t[1]);
p[1]=(k[1][0]*t[0])+(k[1][1]*t[1]);
p[2]=(k[0][0]*t[2])+(k[0][1]*t[3]);
p[3]=(k[1][0]*t[2])+(k[1][1]*t[3]);
k1[0][0]=k[1][1];
k1[0][1]=-(k[0][1]);
k1[1][0]=-(k[1][0]);
k1[1][1]=k[0][0];

det=(k1[0][0]*k1[1][1])-(k1[0][1]*k1[1][0]);
for(i=0;i<26;i++)
{
if((det*i)%26==1)
{
d=i;
}
}
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
k2[i][j]=(d*k1[i][j])%26;


}
}
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
if(k2[i][j]<0)
k2[i][j]+=26;
}
}
pp[0]=((k2[0][0]*p[0])+(k2[0][1]*p[1]))%26;
pp[1]=((k2[1][0]*p[0])+(k2[1][1]*p[1]))%26;
pp[2]=((k2[0][0]*p[2])+(k2[0][1]*p[3]))%26;
pp[3]=((k2[1][0]*p[2])+(k2[1][1]*p[3]))%26;
for(i=0;i<m;i++)
{
printf("\nThe decrypted plain text :%c",aa[pp[i]]);
}
getch();
}

 
char aa[26]="abcdefghijklmnopqrstuvwxyz";

boyle bir tanimlama olmaz. ya aa char dizisinin uzunlugunu initiliaze dizisi ile belirleyin. ya da boyutu vermek istiyorsaniz acik acik yazin:

char aa[26]= { 'a','b', ... '\0' }

sorununuz sondaki null karakterini bulamamasindan kaynaklaniyor. initiliaze degeri atandiginda bu otomatik konulur. ancak 26 katakter dolup 27. null yapmaya calistiginda yukaridaki hata olusur.
  • bdiablo  (03.05.12 00:18:42) 
char aa[26]= {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

ya da böyle

string aa = "abcdefghijklmnopqrstuvwxyz";
  • ocanal  (03.05.12 00:25:22) 
hmm öncelikle teşekkür ederim bir başka şey sorayım konu açılmışken şimdi en basitinden şunu nasıl yaparız bir kelime girildi ve bu ali ben bunu 3 boyutlu bir diziye D[1]=1 D[2]=12 D[3]=9 şeklinde nasıl yerleştiririm

for(int j=0;j<strlen(alfabe);j++) /şeklinde harf harf alırız kelimeyi/

bundan sonra bir türlü yapamadım
  • allstar  (03.05.12 00:56:36) 
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
string aa = "abcdefghijklmnopqrstuvwxyz";
string input;

cin >> input;
for(int i = 0; i < input.size(); i++){
cout << aa.find(input[i], 0)+1 << endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
  • ocanal  (03.05.12 01:42:44) 
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
int main (){
int c,i,j,k,*D;
char kelime[20];
char alfabe[]="abcdefghijklmnoprstuvyz"; /alfabeyi karakter dizisi olarak tanımlıyoruz/
printf("Sifrelencek kelimeyi kucuk harf olarak giriniz:");
scanf("%s",&kelime);

c=strlen(kelime); /sterlen komutu alınan kelimenin kaç karakter olduğunu belirliyor/
printf("%d",c);
for(int i=0;i<c;i++) {
for(int j=0;i<c;j++) {
D = (int *) malloc( sizeof(int)*c ); /kelimenin harflerini sayıya dönüştürürken kullanacağımız sayı dizisi boyutu için dinamik bellek kullanıyoruz/
if(kelime[i]==alfabe[j]){ D[i]=j;} /eğer alfabenin ilk harfi ile kelimenin ilk harfi aynı ise sayı dizisine kaçıncı harf olduğunu atıyoruz değil ise alfabeden sıradaki harfi seçip aynı olana kadar karşılaştırma yapıyoruz/
}}

for(int k=0;k<c;k++) { /şifrelenmiş hali çıktı veren aşama/
printf("%d",D[i]);}}


peki ben bu yazdığımda neden hata alıyorum
  • allstar  (03.05.12 02:57:44) 
1- son satırda

printf("%d",D[i]);

şeklinde yazmışsın ama for döngüsünde artık "i" değil k değeri kullanılıyor.
_________________________________________________

2- comment'leri buraya kopyalarken yazdığını düşünüyorum, ama yine de söyleyeyim,

/* bu şekilde */

veya

// bu şekilde

comment yazmalısın.
_________________________________________________

3- c++ demişsin ama printf filan kullandığına göre sanırım c olarak derliyorsun kodu,

c'de for loop içerisinde initialize işlemi yapamıyorsun.

yani,

for(int i = 0; i < 26; i++) // sadece c++ için çalışır
int i;
for(i = 0; i < 26; i++) // hem c++ hem de c için çalışır
_________________________________________________

4- bir de iç içe for döngüsündeki ikinci for döngüsünde yani alfabeyi iterate ettiğin bölümde şu şekilde yazmışsın,

for(int j=0;i<c;j++)

dikkat edersen döngü içerisinde j kullanıyorsun ama kontol için i < c demişsin. o yüzden tüm alfabeyi döndürmek yerine sadece girdiğin kelimenin uzunluğu kadar çalışır. bir de üstüne yukarıdaki for döngüsü için de i kullanıldığında iyice garip bir durum ortaya çıkar. doğrusu şöyle olacak,

for(int j=0;j<c;j++)

_________________________________________________

5- son olarak hata değil ama kodun daha hızlı çalışması için bir öneri.
eğer harf alfabede bulunduysa artık kalan diğer harfleri de taramana gerek yok, o yüzden "break" komutuyla for döngüsünü o anda sonlandırabilirsin.

yani şöyle,

for(i=0;i<c;i++) {
for(j=0;j<26;j++) {
if(kelime[i]==alfabe[j]) {
D[i]=j;
break;
}
}
}
_________________________________________________

düzenlenmiş, çalışan koda da buradan bakabilirsin.
dl.dropbox.com
  • ocanal  (03.05.12 12:54:04 ~ 14:12:53) 
ya o kadar yardımcı oldun ki nasıl teşekkür ediceğimi bilemedim çok çok çok sağol


  • allstar  (03.05.12 13:59:36) 
1
buraya yazılanların hakları Sir Anthony Hopkins'e aittir.
yazan eden compumaster, ilgilenen eden fader
modere edenler angelus, Artibir, aychovsky, baba jo, basond, compumaster, deckard, duyulmasi gerektigi kadar, fader, fraise, groove salad, kahvegibi, kaymaktutmayansicaksut, kibritsuyu, monstro, pandispanya, robin, ron dennis
bu sitede yazılanların hiçbiri doğru değildir. site içeriği küçükler için sakıncalı olabilir. yazılardan yazarları sorumludur. kaynak göstermeden alıntılanamaz. devlet tarafından atanmış bir kurumun internet üzerinde kimin hangi bilgiye ulaşıp ulaşamayacağına karar vermesi insan haklarına aykırıdır. web siteleri kullanıcıların istekleri doğrultusunda bağlandıkları yerlerdir. kullanıcılar isterlerse bir web sitesine bağlanmayabilirler. bu güçleri ve imkanları mevcuttur. bir kullanıcı bir siteye bağlanmak istiyorsa bu onun tercihi ve hakkıdır. bağlanmak istemiyorsa bu yine onun tercihi ve hakkıdır. halkın kendisine hizmet etmesi için görevlendirdiği kurumlar hadlerini aşıp halka neye ulaşıp ulaşmayacağını bilmeyen cahil cühela muamelesi edemezler. ebeveynlerin çocuklarını sakıncalı içeriklerden koruması için çok sayıda bedava ve ücretli yazılım mevcuttur. bu yazılımlar bir web tarayıcısını kullanmaktan daha karmaşık teknik bilgi gerektirmemektedir. devletin milletini küçük düşürmesi ve ebleh yerine koyması yasaktır. Skimlinks ile linkler üzerinden yönlendirme payı alınmaktadır.