İstifadəçi girişinə əsasən, yaddaşın dinamik şəkildə ayrılmasını müəyyənləşdirin

Aşağıdakı hərəkətləri yerinə yetirən bir proqram yazmalıyam:

  • İstifadəçiyə xəbər verin və daxil olduqları neçə sözdən soruşun.
  • Hər bir sözü saxlamaq üçün malloc () istifadə edərək dinamik yaddaş ayırın
  • Göstəriciləri hər bir ayrı söz satırına saxlamaq üçün dinamik olaraq başqa bir sıra ayırın, onu göstəricilərlə doldurun
  • Daxil olan sözün müvəqqəti saxlanması üçün dinamik olaraq əlavə bir sıra ayırır
  • İstifadəçidən əvvəllər daxil etdikləri sözlərlə eyni sayda simli daxil etməyi xahiş et.
  • Hər bir söz oxunduğu kimi, istifadəçinin girişini müvəqqəti array bir sözü bir seferde oxuyun, dinamik olaraq dağılan seriallardan birinə ötürün.
  • Bütün bunlardan sonra mən hər sözü ayrı-ayrılıqda çap edə bilərəm.

Nümunə bir nümunə bu kimi görünə bilər:

 How many words do you wish to enter? 5 Enter 5 words now: I enjoyed doing this exercise Here are your words: I enjoyed doing this exercise 

Bir xətt oxuyarkən, proqram, sözü saxlama müvəqqəti dizisində oxumalı, sözü saxlamaq və ünvanı bir sıra karakter göstəricilərinə saxlamaq üçün kifayət qədər saxlama ayırmaq üçün malloc () istifadə etməlidir. Bu addımı necə idarə etmək olar?

İşdə mənim sualım: Bir müvəqqəti dizimin ölçüsünü bir istifadəçi daxil edə biləcəyi hər hansı bir keyfi sözü ehtiva edən böyük ölçüsü necə müəyyən edə bilərəm və onu bir saxlama arrayinə necə köçürə bilərəm?

 #include <stdio.h> #include <stdlib.h> enum { MAX_WORD_SIZE = sizeof("Supercalifragilisticexpialidocious") }; void resign(char**,int); int main() { char **p; int n,i; printf("How many words do you wish to enter?"); scanf("%d", p=calloc(n, sizeof(char*)); puts("Here are your words:"); resign(p,n); for (i=0; i<n; i++) { puts(p[i]); } } void resign(char**p,int n) { int i=0,j=0; char c; char * temp_word = NULL; getchar(); temp_word = malloc(MAX_WORD_SIZE); while ((c=getchar())!='\n') { if (c!=' ') temp_word[i++]=c; else {temp_word[i]='\0'; p[j]=temp_word; temp_word = malloc(MAX_WORD_SIZE); i=0;j++;} } temp_word[i]='\0'; p[j]=temp_word; free(temp_word); } 
-13
05 янв. usb-ananas tərəfindən təyin 05 Yan 2015-01-05 18:38 '15 saat 18:38 'də 2015-01-05 18:38
ответ 1 cavab

Burada malloc() bir təsviri var.

Bu bayt parametresinin size alır.

Buna görə, istifadəçi 5 sözlə girmişsə, əvvəlcə 5 marka saxlamaq üçün kifayət qədər bir sıra ayırmalısınız.

Məsələn,

 char ** words = NULL; words = malloc(sizeof(char *) * <NUMBER OF CHARACTERS THE USER ENTERED>); 

ASCII'nin istifadə edildiyini və karakterin char olduğunu varsayarsak, sözcüklerdeki her bir məktub bir bayttır. Ayrıca, hər hansı bir boşluğu, doğrusal kanalları, ehtimal ki, bir çarx qaynağını və sıfıranı nəzərə almalıyıq.

Belə ki, bir sözlə neçə məktub var? IDK, bu sizin üçündür. Ancaq Məryəm Poppins'in "Supercalifragilisticexpialidocious" ən uzun sözlə qarşılaşdığına inanırıqsa, o zaman ən azı 34 simvol və son sıfır terminator üçün əlavə bir seçməliyik. Beləliklə, hər bir söz üçün 35 bayta buraxırıq.

Bu işləyəcək:

 enum { MAX_WORD_SIZE = sizeof("Supercalifragilisticexpialidocious") }; 

Bu da nəzərə alınacaq ki, son \0 - MAX_WORD_SIZE 35 olacaq.

 char * temp_word = NULL; temp_word = malloc(MAX_WORD_SIZE); 

Sözlərinizin digər dizilerini yaratmaq üçün bir döngədə oxşar bir şey etmək lazımdır:

 for(int i = 0; i< <NUMBER OF WORDS THE USER ENTERED>; i++) { words[i] = malloc(MAX_WORD_SIZE); } 

İstifadəçi tərəfindən daxil edilən sözlərin sayını bir tamsayıya çevirmək üçün atoi()

Bundan sonra getchar() bir anda stdin bir xarakterdən bir simli çəkmək və getchar() yerə yerləşdirmək üçün ' ' space" ünvanına gedərkən dayandırmaq üçün istifadə edə bilərsiniz.

strcpy() dizilerinizden birinə müvəqqəti array kopyalamak üçün strcpy() istifadə edə bilərsiniz, müvəqqəti dizinin sözündən sonra hər zaman bir trailig \0 olduğuna əmin olun.

Bu işarə edildikdən sonra free() olmağı unutmayın free() .

Hesab edirəm ki, bu, dinamik yaddaşda bəzi tapşırıqlar üçün bunu edirsiniz və buna görə də tətbiqiniz bu kimi müəyyən edilir. Amma bunu etməsəniz, əvvəlcə fgets() istifadə edərək, bir tamponda giriş oxumaq və strtok() oxumaqdan sonra simli bölmək üçün istifadə strtok() . Bu yanaşma daha çox yaddaş tələb edir, lakin daha təmiz olacaq.

Diqqət calloc() başqa bir şey dağıtımınızı yerinə yetirmək üçün malloc() calloc() əvəzinə calloc() istifadə calloc() , belə ki, bütün dizilerinizin 0 ilə calloc() təmin edə bilərsiniz - bu məlumatlar varsa, daha sonra bəzi qarışıqlıqları saxlaya bilərsiniz artıq bu dizilərdə zibil haqqında.

Düşünmək üçün başqa bir şey: bu temp_word[MAX_WORD_SIZE]; müvəqqəti array temp_word[MAX_WORD_SIZE]; istifadə edərək, avtomatik olaraq və ya statik olaraq təyin edilə bilər temp_word[MAX_WORD_SIZE]; MAX_WORD_SIZE'yi sabit olaraq saxlamaq üçün enum istifadə etdiyim üçün. Bunun üçün malloc istifadə etmək üçün birbaşa ehtiyac yoxdur.

0
05 янв. Cavab Nick 05 jan verilir . 2015-01-05 19:18 '15 'də 19:18' da, 2015-01-05 19:18

bağlı digər suallar və ya sual