Προς το περιεχόμενο

array to long long στη C


karabouzouk...

Προτεινόμενες αναρτήσεις

Δημοσ.

Δεν βρήκα κάποια έτοιμη συνάρτηση για να το κάνω αυτό και δεν είμαι σίγουρος για το πώς...! Έχει κάποιος καμιά ιδέα..!?

Αυτό ακριβώς που θέλω να κάνω είναι από μιά συμβολοσειρά πχ την "ΑΑΑΑΑΑ" να φτιάξω εναν ακέραιο με βάση τον ASCII αριθμό του κάθε γράμματος, τον 656565656565 για το συγκεκριμένο παράδειγμα...

Και όπως ανεφέρω και στον τίτλο ο ακαίρεος να είναι τύπου long long..

 

Ευχαριστώ για όποια βοήθεια

 

---------- Το μήνυμα προστέθηκε στις 11:57 ----------

 

Τελικά κάτι έφτιαξα...

>#include<stdio.h>
#include<math.h>
int main(){
   int i,d;
   char a[]="ABCDEFGH";
   long long ar=0;

   printf("%d\n\n",sizeof(a));
   d=2*(sizeof(a)-2);
   for (i=0; i<8; i++){
       ar+=(int)a[i]*pow(10,d);
       d-=2;
   }
   
   
   printf("%lld\n\n", ar);

   return 0;
}

 

Αν ξέρετε κάποιο καλύτερο ή πιο γρήγορο τρόπο παρακαλώ γράψτε τον εδώ..

Δημοσ.

>[color="#0000ff"]#include[/color] <iostream>
[color="#0000ff"]#include[/color] <string.h>

[color="#0000ff"][b]using[/b][/color] [color="#0000ff"][b]namespace[/b][/color] std;

[color="#8000ff"]int[/color] main()
{
[color="#8000ff"]char[/color] a[] = [color="#a31515"]"zzBBCCDD"[/color];
[color="#8000ff"]int[/color] len = strlen(a);

[color="#8000ff"]long[/color] [color="#8000ff"]long[/color] number = [color="#ff8000"]0[/color];

[color="#0000ff"][b]for[/b][/color] ([color="#8000ff"]int[/color] i=[color="#ff8000"]0[/color]; i<len; i++)
{
	[color="#0000ff"][b]if[/b][/color] (a[i] < [color="#ff8000"]100[/color])
		number *= [color="#ff8000"]100[/color];
	[color="#0000ff"][b]else[/b][/color]
		number *= [color="#ff8000"]1000[/color];
	number += a[i];
}

cout << number << endl;
system([color="#a31515"]"pause"[/color]);
[color="#0000ff"][b]return[/b][/color] [color="#ff8000"]0[/color];
}  

 

---------- Το μήνυμα προστέθηκε στις 14:27 ----------

 

Διόρθωσα ένα bug (if (a < 100))

Δημοσ.
Δεν βρήκα κάποια έτοιμη συνάρτηση για να το κάνω αυτό και δεν είμαι σίγουρος για το πώς...! Έχει κάποιος καμιά ιδέα..!?

Αυτό ακριβώς που θέλω να κάνω είναι από μιά συμβολοσειρά πχ την "ΑΑΑΑΑΑ" να φτιάξω εναν ακέραιο με βάση τον ASCII αριθμό του κάθε γράμματος, τον 656565656565 για το συγκεκριμένο παράδειγμα...

Και όπως ανεφέρω και στον τίτλο ο ακαίρεος να είναι τύπου long long..

 

Ευχαριστώ για όποια βοήθεια

 

---------- Το μήνυμα προστέθηκε στις 11:57 ----------

 

Τελικά κάτι έφτιαξα...

>#include<stdio.h>
#include<math.h>
int main(){
   int i,d;
   char a[]="ABCDEFGH";
   long long ar=0;

   printf("%d\n\n",sizeof(a));
   d=2*(sizeof(a)-2);
   for (i=0; i<8; i++){
       ar+=(int)a[i]*pow(10,d);
       d-=2;
   }
   
   
   printf("%lld\n\n", ar);

   return 0;
}

 

Αν ξέρετε κάποιο καλύτερο ή πιο γρήγορο τρόπο παρακαλώ γράψτε τον εδώ..

 

Είναι απλό type casting

 

>char *str="AAAAAAAA";
if(strlen(str)%4!=0){
   puts("Wrong string");
   return;
}
LONGLONG *lng=(LONGLONG*)str;

Δημοσ.
Είναι απλό type casting

 

>char *str="AAAAAAAA";
if(strlen(str)%4!=0){
   puts("Wrong string");
   return;
}
LONGLONG *lng=(LONGLONG*)str;

 

Ο φίλος ζήτησε να γίνεται σε δεκαδικό σύστημα ο αριθμός με την μορφή XXYYZΖ.

Αυτό που δείχνεις είναι σε δυαδικό (και δεκαεξαδικό) και επιπλέον πρέπει το string να είναι world aligned για να παίξει.

Δημοσ.
Ο φίλος ζήτησε να γίνεται σε δεκαδικό σύστημα ο αριθμός με την μορφή XXYYZΖ.

Αυτό που δείχνεις είναι σε δυαδικό (και δεκαεξαδικό) και επιπλέον πρέπει το string να είναι world aligned για να παίξει.

Διάβασε καλά τι γραφει. Για "AAAAAA" θέλει ο αριθμός να είναι 6565656565.

Δημοσ.
Διάβασε καλά τι γραφει. Για "AAAAAA" θέλει ο αριθμός να είναι 6565656565.

 

Μάλλον εσύ θα πρέπει να το δεις λίγο καλύτερα.

 

char *s = "AAAA";

 

int l = *(int *)a;

cout << l << endl;

 

Το αποτέλεσμα είναι 1094795585 και όχι 65656565 που θέλει ο φίλος.

Το 1094795585 σε hex είναι 0χ41414141. Για αυτό σου είπα πριν ότι ο τρόπος που δίνεις ισχύει για binary και hex. Όμως ζητήθηκε 65 για το Α, άρα μιλάμε για δεκαδικό.

 

Επιπλέον ο τρόπος σου έχει λάθος έτσι και αλλιώς.

 

char *s = "AAZZ";

 

int l = *(int *)a;

cout << l << endl;

 

Θα περιμέναμε 0χ41415Α5Α

Όμως αν το τρέχουμε σε little endian (PC) σύστημα βγαίνει φυσικά ανάποδα, δηλαδή :

0χ5A5A4141

Δημοσ.
Μάλλον εσύ θα πρέπει να το δεις λίγο καλύτερα.

 

char *s = "AAAA";

 

int l = *(int *)a;

cout << l << endl;

 

Το αποτέλεσμα είναι 1094795585 και όχι 65656565 που θέλει ο φίλος.

Το 1094795585 σε hex είναι 0χ41414141. Για αυτό σου είπα πριν ότι ο τρόπος που δίνεις ισχύει για binary και hex. Όμως ζητήθηκε 65 για το Α, άρα μιλάμε για δεκαδικό.

 

Επιπλέον ο τρόπος σου έχει λάθος έτσι και αλλιώς.

 

char *s = "AAZZ";

 

int l = *(int *)a;

cout << l << endl;

 

Θα περιμέναμε 0χ41415Α5Α

Όμως αν το τρέχουμε σε little endian (PC) σύστημα βγαίνει φυσικά ανάποδα, δηλαδή :

0χ5A5A4141

 

Έχεις δίκιο :).

 

---------- Το μήνυμα προστέθηκε στις 23:01 ----------

 

Έχεις δίκιο :).

Δικη μου έκδοση.

>#include <stdio.h>
#include <windows.h>
#include <math.h>

int main(int argc, char* argv[])
{
char* buffer=	"AAAZ"
				"\x09"
				"ZZAl"
				"\x07";
long long result=0;
unsigned int len=strlen(buffer);
int pwr=0;
for(unsigned int i=0;i<len;i++){
	if(buffer[len-i]>100){
		pwr+=3;
	}else if(buffer[len-i]<10 && i!=0){
		pwr++;
	}else if(buffer[len-i]>10 && buffer[len-i]<100){
		pwr+=2;
	}
	long long temp=buffer[len-i-1]*pow(double(10),int(pwr));
	result+=temp;
}
printf("%lld",result);
getchar();
return 0;
}

Δημοσ.

m1cRo ο τρόπος σου είναι σχοδόν ίδιος με τον δικό μου μόνο που παίρνεις και περιπτώσεις για το μέγεθος του ASCII αριθμού κάθε χαρακτήρα.. ευχαριστώ

 

Τώρα θέλω να κάνω και το αντίθετο.. από έναν long long αριθμό να πάρω τους χαρακτήρες που αντιστιχούν στους αριθμούς ανα δύο.

Δηλαδή θεωρώ ότι κάθε δύο ψηφία αντιστοιχούν σε ένα ASCII χαρακτήρα..

δηλαδή το 6566676869707172 να μεταφραστεί σε "ABCDEFGH"

 

---------- Το μήνυμα προστέθηκε στις 12:26 ----------

 

νομίζω ότι πρέπει να είναι περίπου έτσι το κύριο μέρος του..

 

 

>for(i=BLOCK_SIZE-1; i>=0; i--){
           block[i]=intmi%100;
           intmi/=100;
       }

Δημοσ.

Άλλος τρόπος είναι να τα κανεις μετατροπή σε string και να δουλεύεις με strings.

 

Έχει δίκιο ο kagelos μήπως από την αρχή ήθελες να γίνετε μετατροπή σε hex και πίσω??

Δημοσ.
Άλλος τρόπος είναι να τα κανεις μετατροπή σε string και να δουλεύεις με strings.

 

ακριβώς αυτός είναι ο σκοπός μου να τα μετατρεψω σε string και λόγο του ότι δεν έχουν σταθερό μήκος οι αριθμοί ASCII σκεύτηκα να τους περιορίσω μόνο στους διψήφιους μιας και η άσκηση δεν προωρίζεται για επαγκελματική χρήση.

Αν χρησιμοποιήσουμε μόνο διψήφιουσ ASCII είναι σωστή η σκέψη μου..?

 

αν έχετε κάποια πρόταση βέβαια είναι ευπρόσδεκτη..

 

---------- Το μήνυμα προστέθηκε στις 13:16 ----------

 

Έχει δίκιο ο kagelos μήπως από την αρχή ήθελες να γίνετε μετατροπή σε hex και πίσω??

 

Όχι για το σκοπό που το θέλω δεν βοηθάει σε hex..

αλλά τι διαφορά έχει από το να τους μετατρέπω στο δεκαδικό..?

Δημοσ.

Όχι για το σκοπό που το θέλω δεν βοηθάει σε hex..

αλλά τι διαφορά έχει από το να τους μετατρέπω στο δεκαδικό..?

 

Τεράστια. Ξέρεις ότι κάθε χαρακτήρας είναι 1 byte. Τώρα μετατρέποντάς το string σε σειρά δεκαδικών αριθμών δεν ξέρεις αν είναι διψήφιοι ή τριψήφιοι. Ενώ στο hex μέχρι το 256 είναι διψήφιοι οι αριθμοί (FF). Αν βέβαια θεωρήσεις τους αριθμούς σου διψήφιους τότε μπορείς να το κάνεις. Αλλά χάνεις όλους τους χαρακτήρες από 100 και πάνω.

Δημοσ.
ακριβώς αυτός είναι ο σκοπός μου να τα μετατρεψω σε string και λόγο του ότι δεν έχουν σταθερό μήκος οι αριθμοί ASCII σκεύτηκα να τους περιορίσω μόνο στους διψήφιους μιας και η άσκηση δεν προωρίζεται για επαγκελματική χρήση.

Αν χρησιμοποιήσουμε μόνο διψήφιουσ ASCII είναι σωστή η σκέψη μου..?

 

αν έχετε κάποια πρόταση βέβαια είναι ευπρόσδεκτη..

 

---------- Το μήνυμα προστέθηκε στις 13:16 ----------

 

 

Όχι για το σκοπό που το θέλω δεν βοηθάει σε hex..

αλλά τι διαφορά έχει από το να τους μετατρέπω στο δεκαδικό..?

 

Το 10 δεν είναι δύναμη του 2 "γιαυτο" δεν μπορείς να είσαι σίγουρος στα όρια ενός αριθμού ενώ αν πάρεις το hex τότε κάθε byte αντιστοιχεί ακριβώς σε 2 hex characters ενώ κάθε character στον ascii πιάνει ακριβώς ένα byte αν σου δώσω στο δεκαδικό σύστημα έναν αριθμό 111 εσύ δεν μπορείς να ξέρεις αν είναι τρεις άσοι η 11 και 1 η κάτι άλλο ενώ αν σου δώσω σε δεκαεξαδικό 13f214 εδώ είσαι σίγουρος τι είναι τι, τα spas ανά 2 και έχεις 12 f2 14.

Δημοσ.

Εαν το θελεις σε δεκαδικο, θα πρεπει να ορισεις ενα φορματ. Πχ το hex, ξερεις οτι ειναι του τυπου ff=byte, για το δεκατικο μπορεις να κανεις κατι σα και αυτο 000=byte

Ετσι το max uint θα ειναι

Hex=ffffffff

dek=255255255255

και το Min

Hex=00000000

del=000000000000

 

Ενα προχειρο κωδικα που εκανα

>// ca_1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#define cw(msg,str) printf("%s:%s\n",msg,str)
#define _byte unsigned char 


void getDek(char* des,int value)
{
_byte* tmp = (_byte*) &value;
sprintf(des,"%03d%03d%03d%03d",tmp[0],tmp[1],tmp[2],tmp[3]);
}
void getValue(char* dek,int* outValue);

int _tmain(int argc, _TCHAR* argv[])
{
char hex[4];
char dek[12];
int value = 123456789;


sprintf(hex,"%x",value);
cw("Hex value",hex);

getDek(dek,value);
cw("Dek value",dek);
int tmpValue=0;
getValue(dek,&tmpValue);
printf("Value of dek is:%d\n",tmpValue);
tmpValue=0;
sscanf(hex,"%x",&tmpValue);
printf("Value of hex is:%d\n",tmpValue);


getchar();


return 0;
}

void getValue(char* dek,int* outValue)
{
_byte tmp[4];
sscanf(dek,"%03d%03d%03d%03d",&tmp[0],&tmp[1],&tmp[2],&tmp[3]);
memcpy(outValue,tmp,4);
}

 

Εχει ενα bug στο σημειο

>void getValue(char* dek,int* outValue)
{
_byte [color="Red"]tmp[/color][4];
sscanf(dek,"%03d%03d%03d%03d",&tmp[0],&tmp[1],&tmp[2],&tmp[3]);
memcpy(outValue,tmp,4);
}

 

Αλλα δουλευει. ;)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...