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

ερωτηση για string στη c


stefanos59

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

Δημοσ.

καλησπερα θα ηθελα να ρωτησω:

θελω να ζηταω απο τον χρηστη να μου πχ εναν αριθμητικο κωδικο οσο μεγαλος και αν ειναι, και στην συνεχεια να τον ελεγχο αυτον τν αριθμο ψηφιο ψηφιο..

τον κωδικα θα τον δηλωσουμε ως string

px κατι τετοιο

>#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main(){
string int number;
printf("Dwse ton kwdika:");
scanf("%s",&number); 
/*ena for pou elegxei kathe psifio tou kvdika*/ 
printf("o arithmos pou edwses einai o %s",number);
 system("PAUSE")  ;
   
   
}

  • Απαντ. 37
  • Δημ.
  • Τελ. απάντηση
Δημοσ.

Δεν υπάρχει τύπος δεδομένων "string" στη standard library της C. Πίνακας τύπου char είναι αυτό που θέλεις. Στο παράδειγμά σου θα δήλωνες π.χ.:

 

>
char numberAsString[256];

 

Και όταν διαβάζεις είσοδο από τον χρήστη, θα περιορίζεις αντίστοιχα τον αριθμό των μάξιμουμ χαρακτήρων που θα διαβάζονται, για να μην έχεις overflow.

Δημοσ.

θα μπορούσες να κάνεις κάτι ως εξής:

>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char *ptr;
   int i = 0, num;
   ptr = malloc(sizeof(char));
   while((ch = getchar()) != EOF){
       ptr[i] = ch
       i ++;
       ptr = realloc(ptr, (i+1)*sizeof(char));
   }
   ptr[i] = '\0';
   num = atoi(ptr); /* o arithmos pou 8es! */
}

 

πιστε'υω αυτό να βοηθήσει, δεν την έχω χρησιμοποιήσει εγώ την realloc, θα μπορούσες να θέσεις ένα μέγιστο όριο, π.χ. το όριο ενός int ή κάτι άλλο και να ορίσεις εξ' αρχής ένα πίνακα με τόσες θέσεις.

Δημοσ.

θα μπορούσες να κάνεις κάτι ως εξής:

>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char *ptr;
   int i = 0, num;
   ptr = malloc(sizeof(char));
   while((ch = getchar()) != EOF){
       ptr[i] = ch
       i ++;
       ptr = realloc(ptr, (i+1)*sizeof(char));
   }
   ptr[i] = '\0';
   num = atoi(ptr); /* o arithmos pou 8es! */
}

 

πιστε'υω αυτό να βοηθήσει, δεν την έχω χρησιμοποιήσει εγώ την realloc, θα μπορούσες να θέσεις ένα μέγιστο όριο, π.χ. το όριο ενός int ή κάτι άλλο και να ορίσεις εξ' αρχής ένα πίνακα με τόσες θέσεις.

 

το μέγεθος 256 που πρότεινε πριν ο parsifal είναι το σωστό στην συγκεκριμένη περίπτωση, μιας και δεν ξέρει πόσους χαρακτήρες θα έχει και μίας και είναι το μέγιστο.

Δημοσ.

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

Δημοσ.

εκανα το παρακατω αλλα δν τρεχει σωστα για καθε λαθος

>#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char check();
char buf[256];


size_t mikos;

int main(){
 
printf("dwse tn kwdika arithmo\n");
gets(buf);
mikos=strlen(buf);
check();


system("PAUSE");
   
}

////sunartiseis
//sunartisi pou elegxei an uparxei 0 i 1
char check(){
    int i=0;  
    for (i = 0; i < mikos; i++)
{
if ((buf[i]<2))
{
printf ("upirxe to 0 i to 1 ston kwdika arithmo---->>Dwse neo kwdika arithmo:");
gets(buf);
gets(buf);

mikos=strlen(buf);
i=0;

}
}
}

Δημοσ.

Μπορείς να ελέγξεις την ύπαρξη των χαρακτήρων 0 & 1 με την βοήθεια της ρουτίνας memchr η οποία επιστρέφει έναν δείκτη με το σημείο όπου βρέθηκε ο αναζητούμενος χαρακτήρας ή αν δεν υπάρχει NULL.

 

Από εκεί και πέρα, την περίπτωση εισαγωγής μη αποδεκτού κωδικού καλύτερα είναι να την διαχειρίζεσαι εντός του main, με την βοήθεια για παράδειγμα ενός while-loop το οποίο θα επαναλαμβάνεται ενημερώνοντας τον χρήστη κατάλληλα μέχρι ότου δοθεί ένας αποδεκτός κωδικός:

 

>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char* check(char*);
char buf[256];

int main(){

printf("dwse tn kwdika arithmo\n");
while(1)
{
	/* Read from stdin. */
	gets(buf);
	/* Validate buf. */
	if(check(buf) == NULL)/* buf invalid, warn user and redo input. */
		printf("upirxe to 0 i to 1 ston kwdika arithmo----\n>>Dwse neo kwdika arithmo:");
	else/* buf valid, break loop. */
		break;
}

printf("Code = %s\n", buf);

printf("Press Enter to exit!");
getchar();	/* End of program. */
return	0;
}

////sunartiseis
//sunartisi pou elegxei an uparxei 0 i 1
char* check(char *ptrBuff)
{
/* If ptrBuff contains '0' or '1' return NULL else return ptrBuff. */
return (memchr(ptrBuff, '0', strlen(ptrBuff)) ||
	memchr(ptrBuff, '1', strlen(ptrBuff))) ? NULL: ptrBuff;
}

ΕΞΟΔΟΣ:

 

>
dwse tn kwdika arithmo
1234567890
upirxe to 0 i to 1 ston kwdika arithmo----
>>Dwse neo kwdika arithmo:234567890
upirxe to 0 i to 1 ston kwdika arithmo----
>>Dwse neo kwdika arithmo:23456789
Code = 23456789
Press Enter to exit!

Καλή συνέχεια!!

Δημοσ.

Για να μην ανοιγω νεο θεμα και ειναι και συνεχεια του παραπανω ρωταω εδω..

θελω τον καθε ψηφιο που παιρνω απο τον κωδικα να τον αντιστοιχο σε καποια γραμματα και στην συνεχεια να εμφανιζω τις εναλλακτικες λεξεις.

Πχ. το 2-->{Α,Β}

το 3-->{C,D}

 

και εγω του δινω τον κωδικα 23

θα ηθελα να μου εμφανιζει τους παρακατω συνδυασμους:

1.ΑC

2.AD

3.BC

4.BD

 

εχω κανει το παρακατω

>#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
//sunartisi gia ton elegxo psifiwn
char* check(char*);




char buf[256];
char new_buf[256];
char two[12]="ABC";
char three[12]="DEF";
char four[12]="GHI";
char five[12]="JKL";
char six[12]="MNO";
char seven[12]="PRS";
char eight[12]="TUV";
char nine[12]="WXY";
size_t mikos;
int main(){
int i=0;
int j=0;
int d;
       printf("Dwse tn kwdika arithmo\n");
       while(1)
       {
               
               gets(buf);
               
               if(check(buf) == NULL)
                       printf("Upirxe to 0 i to 1 ston kwdika arithmo\nDwse neo kwdika arithmo:");
               else
                       break;
       }

       printf("O kwdika arithmos pou edwses einai o %s\n", buf);
       mikos=strlen(buf);
       d=pow(3,mikos);//pithanoi sundiasmoi leksewn
       for(j=0;j<d;j++){
         for(i=0;i<=miko;i++){
        
            if(buf[i]=2){
          printf("%s",two);
          }  
            if(buf[i]=3){
          printf("%s",three);
          }  
            if(buf[i]=4){
          printf("%s",four);
          }  
            if(buf[i]=5){
          printf("%s",five);
          }  
            if(buf[i]=6){
          printf("%s",six);
          }  
            if(buf[i]=7){
          printf("%s",seven);
          }  
            if(buf[i]=8){
          printf("%s",eight);
          }  
            if(buf[i]=9){
          printf("%s",nine);
          }                 
                                                                   
       }
       }
       printf("Press Enter to exit!");
       getchar();      // End of program.
       return  0;
}

////sunartiseis
//sunartisi pou elegxei an uparxei 0 i 1
char* check(char *ptrBuff)
{
     
     if(ptrBuff=='0' || ptrBuff=='1')
     return NULL;
     else 
     return ptrBuff;
     
     strlen(ptrBuff);

}

Δημοσ.

για αρχή άλλαξε τα = από τα if σου σε ==

 

π.χ. if(buf=5){

 

μετά το

d=(int)pow(3,mikos);

 

και το

for(i=0;i<=mikos;i++){

 

επίσης άλλαξε το gets με fgets και την συνάρτηση check

τέλος ο τρόπος που δηλώνεις τους πίνακες δεν είναι ότι καλύτερο.Στο έφτιαξα διαφορετικά

δες τον κώδικα ,ότι δεν καταλαβαίνεις ρώτα

 

ο κώδικας σου με τις αλλαγές για να κάνει compile.

 

>

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
//sunartisi gia ton elegxo psifiwn
int check(char*);


char buf[256];
char numberLetters[10][4];
size_t mikos;
int main(){

int i=0,j=0,d;
for (i=2;i<10;i++){
   for (j=0;j<4-1;j++)
           numberLetters[i][j]=(char)((int)'A'+i+j-2);
   numberLetters[i][3]='\0';
   printf("\ni=%d ---> letters=%s",i,numberLetters[i]);
}

       printf("\nDwse ton kwdiko arithmo\n");
       while(1)
       {
               
               fgets(buf,256,stdin);
               if (buf[strlen(buf)-1]=='\n')
                   buf[strlen(buf)-1]='\0';
   
               if(check(buf) == 1)
                       printf("\nUpirxe to 0 i to 1 ston kwdika arithmo\nDwse neo kwdika arithmo:");
               else
                       break;
       }

       mikos=strlen(buf);
       d=(int)pow(3,mikos);//pithanoi sundiasmoi leksewn
       for(j=0;j<d;j++){
         for(i=0;i<=mikos;i++){
            int choice=(int)buf[i]-(int)'0';
            if (choice>1 && choice<10)
               printf("\n%s",numberLetters[choice]);                                                                         
         }
       }
       printf("Press Enter to exit!");
       getchar();      // End of program.
       return  0;
}

////sunartiseis
//sunartisi pou elegxei an uparxei 0 i 1
int check(char *ptrBuff){
   int i=0;
     while(ptrBuff[i]!='\0'){
           if(ptrBuff[i]=='0' || ptrBuff[i]=='1')
               return 1;//yes 0,1
               i++;
     }
    return 0;//no 0,1

}




 

Υ.Γ. όσο για την λειτουργία προσπάθησε να το εξηγήσεις καλύτερα.

Δημοσ.

επειδη αυτο το κομματι δεν το καταλαβαινω

>for (i=2;i<10;i++){
   for (j=0;j<4-1;j++)
           numberLetters[i][j]=(char)((int)'A'+i+j-2);
   numberLetters[i][3]='\0';
   printf("\ni=%d ---> letters=%s",i,numberLetters[i]);
}

 

να γινει καπως ετσι:

>numberLetters[2][3]='A','B','C';
numberLetters[3][3]='D','E','F';
numberLetters[4][3]='G','H','I';
numberLetters[5][3]='J','K','L';
numberLetters[6][3]='M','N','O';
numberLetters[7][3]='P','R','S';
numberLetters[8][3]='T','U','V';
numberLetters[9][3]='W','X','Y';

for (i=2;i<10;i++){
   for (j=0;j<4-1;j++)
   printf("\ni=%d ---> letters=%s",i,numberLetters[i][j]);
}

 

 

επισης και αυτο το κομματι δεν το καταλαβα

>  int choice=(int)buf[i]-(int)'0'

Δημοσ.

εννοεις να εξηγησω τι κανει το προγραμμα?

Ουσιαστικα του δινω ενα κωδικα και θελω να μου εμφανισει τις πιθανες λεξεις που μπορουν να δημιουργηθουν.

πχ.

2-->{Α,Β,C}

3-->{D,E,F}

4-->{G,H,I}

και τα λοιπα..

αν του δωσω λοιπον εγω τον κωδικα

234

θελω να μου εμφανισει

τα παρακατω

ADG

ADH

ADI

AEG

AEH

AEI

AFG

AFH

AFI

BDG

BDH

BDI

BEG

BEH

BEI

BFG

BFH

BFI

CDG

CDH

CDI

CEG

CEH

CEI

CFG

CFH

CFI

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

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

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