PDA

View Full Version : سوال: تخصیص حافظه به رشته و ارسال به تابع؟



one hacker alone
دوشنبه 05 اردیبهشت 1390, 13:10 عصر
با یاد خدا
سلام
من می خواستم از کاربر 2 رشته بگیرم بعد اونها رو به یه تابع ارسال کنم که اون 2 رشته کنار هم قرار بده یعنی ادغام کنه اگه از روش معمولی بخوام برم به صورت زیر در میاد اما می خوام این کار رو از طریق تخصیص حافظه پویا انجام بدم ( malloc() ) بخاطر اینکه من نمیدونم طول رشته کاربر چقدر هست دوستان اگه کسی میتونه راهنمایی کنه ممنون میشم راهنمایی کنید.( نحوه استفاده از تابع malloc رو میدونم اما بکارگیری اون رو به این شکل نمیدونم)









Char a[100],b[100]
Scanf("%s",a)
Scanf("%s",b)
F(a,b)
Void f(char a[100],char b[100])
Char h[]="hi"
Char c [210]
Strcat(c,h)
Strcat(c,a)
Strcat(c,b)

Salar Ashgi
دوشنبه 05 اردیبهشت 1390, 20:15 عصر
لازم نیست این همه انرژی صرف کنید ، با هدر فایل string.h خیلی ساده :


#include <iostream>
#include <conio>
#include <string>
using namespace std;
int main(){
string s1,s2;
cout<<"Enter two strings :\n";
cin>>s1>>s2;
string s3=s1+s2;
cout<<"Merged : "<<s3<<endl;
getch();
}


البته طبق خواسته شما هم میشه نوشت ولی خوب کمی وقت گیر میشه !


#include <iostream>
#include <conio>
#include <string>
using namespace std;
int main(){
int n;
cout<<"Enter size :\n";
cin>>n;
//----------
char *a = new char[n];
for(int i=0;i<n;i++)
cin>>a[i];
//---------------
for(int i=0;i<n;i++)
cout<<a[i];
cout<<endl;
getch();
}


موفق باشید ./

one hacker alone
دوشنبه 05 اردیبهشت 1390, 21:18 عصر
ممنون از پاسختون اما تو c ما string نداریم و باید ارایه تعریف کنیم شما در کدتون از کاربر خواستین طول ارایه رو وارد کنه اما من میخوام اینکار صورت نگیره و کاربر بعد از وارد کردن رشته برنامه اونمقدار فضا رو براش اختصاص بده

شما یه حلقه برای گرفتن ورودی ها گذاشتین در صورتی که ما برای گرفتن رشته از حلقه استفاده نمیکنیم
مثلا طرف اگه بخواد بنویسه سلام باید س Enter ل enter ا enter م enter اینجوری از اب در میاد و این نمیشه
البته ممنون از اینکه پاسخ دادین

دوستان کسی میتونه راهنمایی کنه

amir.bakhtiari
دوشنبه 05 اردیبهشت 1390, 22:33 عصر
مثلا طرف اگه بخواد بنویسه سلام باید س Enter ل enter ا enter م enter اینجوری از اب در میاد و این نمیشه
اگه بخواید یه جمله کامل رو بگیره و تا زدن ENTER بعدی جملیه بعدی تو c++ میتونید از:
getline(cin,var)

Salar Ashgi
دوشنبه 05 اردیبهشت 1390, 23:21 عصر
ممنون از پاسختون اما تو c ما string نداریم و باید ارایه تعریف کنیم


بنده اولش توجه نکرده بودم که منظورتان در زبان سی هست ، البته میشه پیاده سازیشم کرد .



شما در کدتون از کاربر خواستین طول ارایه رو وارد کنه اما من میخوام اینکار صورت نگیره و کاربر بعد از وارد کردن رشته برنامه اونمقدار فضا رو براش اختصاص بده

خوب ببینید اون رشته ورودی شما ، بالاخره یک ماکسیمم طولی دارد و نمیتواند که بی نهایت کاراکتر داشته باشد ، هدف من نشان دادن استفاده از آرایه پویا بود و
اگر شما نخواید که طول از کاربر پرسیده شود ، میتوانید خودتان یک ماکسیمم طول مجازی انتخاب کنید .


شما یه حلقه برای گرفتن ورودی ها گذاشتین در صورتی که ما برای گرفتن رشته از حلقه استفاده نمیکنیم

چرا نمی کنیم ؟! بستگی به کاربردش دارد که در مواقع نیاز استفاده میشود .


مثلا طرف اگه بخواد بنویسه سلام باید س Enter ل enter ا enter م enter اینجوری از اب در میاد و این نمیشه

نه خیر ، اصلا اینطور نیست ؛ کاراکتر ها بدون درنگ و فاصله وارد می شوند ، همچون یک رشته معمولی ؛ چون آرایه ایجاد شده
از نوع پویا بود من از حلقه استفاده کردم وگرنه میشد از cin.getline نیز استفاده کرد .

موفق باشید ./

one hacker alone
سه شنبه 06 اردیبهشت 1390, 16:50 عصر
من نمیخوام یک طول مشخص شده ای برای ارایه در نظر بگیرم برای همین میخوام از تخصیص حافظه استفاده کنم و اساس تخصیص حافظه هم گرفتن یک فضا در حین اجرا هست و این دقیقا اون چیزیه که من میخوام

Salar Ashgi
سه شنبه 06 اردیبهشت 1390, 22:12 عصر
ببینید ، در C شما دو راه دارید : یا اینکه از کاربر طولی نپرسید و یک آرایه ای با ماکسیمم طولی ایجاد کنید و یا اینکه طول را بدانید ، چون برای ایجاد
آرایه پویا ، مطمئنا سایز آرایه نیاز هست ./

one hacker alone
چهارشنبه 07 اردیبهشت 1390, 12:06 عصر
ببینید ، در C شما دو راه دارید : یا اینکه از کاربر طولی نپرسید و یک آرایه ای با ماکسیمم طولی ایجاد کنید و یا اینکه طول را بدانید ، چون برای ایجاد
آرایه پویا ، مطمئنا سایز آرایه نیاز هست ./


خوب اقا ممنون تکلیف مارو روشن کردی من هم دقیقا همینو میخواستم
جالبه اگه قراره برای تخصیص حافظه هم طول رو بدونیم پس چرا تخصیص میکنیم همون مستقیم به تابع ارسال میکنیم

من نمخوام ماکسیمم بزارم
ولی باید این کار عملی بشه یعنی میگین نمیشه؟

m.soleimani
چهارشنبه 07 اردیبهشت 1390, 13:47 عصر
این برنامه به تعداد دلخواه شما رشته به یک آرایه اضافه می‌کنه بعد از تعداد مورد نظر خودت کافیه کنترل Z رو توی کنسول بزنی تا نتیجه رو ببینی موفق باشی./



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
struct node {
char *str;
int len;
};
int main(void) {
struct node **strarray = NULL;
int i = 0, count = 0;
char line[1024];
while(fgets(line, 1024, stdin) != NULL) {

strarray = (struct node **)realloc(strarray, (count + 1) * sizeof(struct node *));

strarray[count] = (struct node *)malloc(sizeof(struct node));

strarray[count]->str = strdup(line);
strarray[count]->len = strlen(line);
count++;
}

for(i = 0; i < count; i++) {
printf("--\n");
printf("[%d]->str: %s", i, strarray[i]->str);
printf("[%d]->len: %d\n", i, strarray[i]->len);
}

for(i = 0; i < count; i++) {
free(strarray[i]->str);
free(strarray[i]);
i++;
}
free(strarray);
system("pause");
return 0;
}

tdkhakpur
پنج شنبه 08 اردیبهشت 1390, 01:55 صبح
این برنامه به تعداد دلخواه شما رشته به یک آرایه اضافه می‌کنه بعد از تعداد مورد نظر خودت کافیه کنترل Z رو توی کنسول بزنی تا نتیجه رو ببینی

تعدا ورودي دلخواه نيست دليلش خط زير در کد ارسالي تان هست که اين کار رو محدود ميکنه


while(fgets(line, 1024, stdin) != NULL) {

به نظر میرسه خواسته ایشان یک کار تحقیقاتی باشه تا حل یک مسئله.
در هر صورت برای این کار ميتوانيد دو اشاره گر و از تخصیص پویای حافظه استفاده کنيد تا بتوانید بینهایت (محدوده ram ) ورودی داشته باشید.
کد زیر این کار رو انجام میده اما باید تحلیل بیشتری در مورد ایدت و ویرایش ورودي انجام بديد تا اعمالی مانند حذف و غیره به ورودی افزوده بشه.


#include <iostream.h>
#include <stdio.h>
#include <conio.h>
int main(int argc, char* argv[])
{
char *str, *tmp, ch;
int c=0;
str = (char *)malloc(1);
tmp = (char *)malloc(1);
do{
ch=getch();
if(ch!=13){
cout<<ch;
tmp = (char*)realloc(tmp, c+1);
memcpy(tmp, str, c);
str = (char*)realloc(str, c+1);
memcpy(str, tmp, c);
str[c]=ch;
c++;
}
}while(ch!=13);
cout<<"\n"<<str;
free(str);
free(tmp);
getch();
return 0;
}

one hacker alone
پنج شنبه 08 اردیبهشت 1390, 12:50 عصر
ممنون از جواب ها
دوستان عزیز میشه در مورد کدهایی که گذاشتین یه خورده توضیح بدین از حلقه do به بعد