PDA

View Full Version : طول رشته در c



amir_80
پنج شنبه 17 مرداد 1392, 12:00 عصر
دوستان من میخوام تو زبان سی یه برنامه بنویسم که یه متن به اندازه دلخواه و در صورت نیاز در چندین خط بگیره و به خروجی تعداد کلمات این متن رو بفرسته
مثلا در جمله "hello i am who i am" وقتی ران میشه بنویسه hello 1 و i 2 و همنیجور

حالا من یه برنامه نوشتم و قسمت اولیه برنامه رو انجام دادم و اون متن داده شده رو شسته رفته کردم یعنی علامت های نگارشی و new line و همه رو حذف میکنه و فقط یه متن میمونه که بین کلمات مختلف یه space هست و این رو تو یه array ذخیره کردم حالا موندم که چطور رو این array کار کنم و کلمات رو از این array بکشم بیرون؟؟خداییش مدتیه روش دارم کار میکنم و راه خاصی به ذهنم نمیرسه

مدیران گرامی اگه سوالو جای غلطی پرسیدم حذف نکنن خواهشا بلکه تاپیک رو انتقال بدن

مرسی

omidshaman
پنج شنبه 17 مرداد 1392, 15:12 عصر
lesson3_Loops (http://www.cprogramming.com/tutorial/lesson3.html)
loop on every character in string (http://stackoverflow.com/questions/9438209/c-for-every-character-in-string)
stringstream (http://www.cplusplus.com/reference/sstream/stringstream/)

amir_80
پنج شنبه 17 مرداد 1392, 18:39 عصر
والا دوست عزیز لینک هایی که دادی کمک خاصی نمیکنه به مورد من

اصلا سوال رو یه جور دیگه میپرسم...اقا راهی وجود داره که تو زبان سی(و نه سی پلاس پلاس) یه array که چند تا کاراکتر توش ذخیره هستن اون کاراکتر ها رو ب هم چسبوند و یک string بگیریم
مثال میزنم

فرض کن من یه [char x[10 تعریف کردم که توش {'s','l','a','m'} هست حالا میخوام بدونم با چه روشی میتونم این حروف رو به هم بچسبونم و تو یه متغیر دیگه ذخیره کنم یعنی متغیری که توش slam به صورت یه string ذخیره بشه

omidshaman
پنج شنبه 17 مرداد 1392, 18:47 عصر
string str;
for(int i=0;i<10;i++)
str.push_back(x[i]);
اون لینکا رو نخوندی دیگه :متفکر:

amir_80
پنج شنبه 17 مرداد 1392, 19:15 عصر
دوست عزیز اینی که گفتی ظاهرا برای زبان ++c هستش من کدش رو برا c میخوام...

omidshaman
پنج شنبه 17 مرداد 1392, 19:33 عصر
شما معلوم هست چی می خوای هر بار سوالت عوض میشه !‌
http://stackoverflow.com/questions/8732325/how-to-declare-strings-in-c
ما string توی c نداریم که یک جمله بریزیم توش باید از ارایه یا پوینتر استفاده کنی .
شما برو یک کتاب بگیر شروع کن به خوندن این قدرم پیام خصوصی نده :)

amir_80
پنج شنبه 17 مرداد 1392, 19:59 عصر
والا سوال من تغییر نکرد همون بود از همون پست اول هی تاکید کردم سی شما هی با سی ++ جواب دادید به هر حالا مرسی جواب دادید... ولی من چون خودم زیاد حال ندارم سوال بپرسم و منتظر جواب بمونم شک نکن تمام این راه ها رو رفتم بعدش اومدم اینجا ...کتابم در حال حاضر دارم روی c programming from novice to professional انتشارات Apress رو میخونم بعضی اوقات هم دیتل...تا حالا با پایتون کار کردم برا همینه یه خرده سی برام ناجوره

omidshaman
پنج شنبه 17 مرداد 1392, 20:08 عصر
آره من حواسم نیست آخه کلا سوال c این جا خیلی وقته کسی نپرسیده :)
الان مشکلت حل شد؟

مصطفی ساتکی
پنج شنبه 17 مرداد 1392, 21:33 عصر
فقط به این خاطر جواب داده شد که چند بار پرسش و پاسخ کردید.

char str[200];
printf("\nplease enter your string:");
gets(str);
int i=0;
const int max_word_count =100;
int word_count =0;
char **word_list = (char**) malloc(max_word_count *sizeof(char*));
int *word_fre = (int*)malloc(max_word_count * sizeof(int));
memset(word_fre,0,max_word_count * sizeof(int));

while ( str[i])
{

while (str[i] && str[i] == ' ')
i++;
if (!str[i])
break;
int start_pos = i;
while (str[i] && str[i] != ' ')
i++;
int len = i - start_pos;
if (!len)
break;
char *word =(char*)malloc(len+1);
word[len]='\0';
strncpy(word,str+start_pos,len);
bool find=false;
int pos = 0;
for ( pos=0;pos < word_count;pos++)
if (!strcmp(word_list[pos],word))
{
find=true;
break;
}
if (find)
{
word_fre[pos]++;
}
else {
word_list[word_count] = (char*)malloc(len+1);
word_list[word_count][len] = '\0';
strcpy(word_list[word_count],word);
word_fre[word_count]++;
word_count++;

}

}

for(int j=0;j < word_count;j++)
printf("%s %d \n",word_list[j],word_fre[j]);
return 0;
}
}

omidshaman
پنج شنبه 17 مرداد 1392, 22:45 عصر
الان یک باگ کوچولو هم هست اگر بعد از کلمه space وارد بشه اشتباه میشه

if(str[i]=='\0')
break;
خط 18 بعد ۲تا while میخواد

این برنامه تو C++‎‎ با 6-7 خط قابله نوشتنه اقا amir دلیل خاصی دازین برای استفاده از c ؟

omidshaman
پنج شنبه 17 مرداد 1392, 23:21 عصر
ورژن C++‎

int main()
{
string str="Hello word Hello word 2 Hello word 2",temp;
stringstream stream(str);
map <string,int> wordsList;
while(stream>>temp)
wordsList[temp]= ++wordsList[temp];
for( map<string,int>::iterator i=wordsList.begin();i!=wordsList.end();i++)
cout<<i->first<<" "<<i->second<<endl;
}

amir_80
جمعه 18 مرداد 1392, 00:38 صبح
دوستان مرسی از زحمتی که کشیدید و وقتی که گذاشتید
مورد حل شد

یه سوال در مورد حرف اقا مصطفی

فقط به این خاطر جواب داده شد که چند بار پرسش و پاسخ کردید

میشه بپرسم چرا؟؟اگه از همون اول پاسخ میدادید مشکلی بود؟؟؟سوالو بد پرسیدم؟مشکل چی بوده که اینجور گفتید؟

hadi0x7c7
جمعه 18 مرداد 1392, 00:41 صبح
بهترین راه شما استفاده از توابع: strdup و strtok و یه ساختار به نام درخت دودویی هست که میتونید این برنامه رو به زبان سی بنویسید:

اینم ساختار هر گره درخت.

struct tnode { /* the tree node: */
char *word; /* points to the text */
int count; /* number of occurrences */
struct tnode *left; /* left child */
struct tnode *right; /* right child */
};

البته پست شماره 9 هم درسته ولی هر بار میاد یه سرچ خطی میزنه که بهینه نیست، یه همین خاطر ما کلمات و تکرار اونا رو توی د.د.ج(درخت دودویی جستجو) ذخیره میکنیم.

omidshaman
جمعه 18 مرداد 1392, 01:10 صبح
میشه بپرسم چرا؟؟اگه از همون اول پاسخ میدادید مشکلی بود؟؟؟سوالو بد پرسیدم؟مشکل چی بوده که اینجور گفتید؟
چون شما درخواست کده اماده داشتین این چیزا رو شما باید خودتون فکر کنین واسش راه حل پیدا کنین اگر مشکلی یا راهنمایی خواستین بیاین بپرسین. یا این که نهایتا کد خودتونو بزارین بعد بگین فلان جاشو نمی دونم چکار کنم !
برنامتون همین جور که میبینین خیلی ساده نوشته میشه...

amir_80
شنبه 19 مرداد 1392, 20:27 عصر
چون شما درخواست کده اماده داشتین این چیزا رو شما باید خودتون فکر کنین واسش راه حل پیدا کنین اگر مشکلی یا راهنمایی خواستین بیاین بپرسین. یا این که نهایتا کد خودتونو بزارین بعد بگین فلان جاشو نمی دونم چکار کنم !

اهان از اون لحاظ والا من چون خودم دانشجوی رشته کامپیوتر هستم نیاز دارم رو برنامه هایی که دارم اول خودم فکر کنم تا اینکه کم کم حداقل فکر کردن شبیه یک برنامه نویس رو یاد بگیرم... البته بینهایت سپاسگذارم که کمک کردید...مرسی


این برنامه تو C++‎‎‎ با 6-7 خط قابله نوشتنه اقا amir دلیل خاصی دازین برای استفاده از c ؟

اره والا من دانشجوی کامپیوتر هستیم...ترم قبل رو با پایتون کار کردیم که خیلی باحال بود ... ترم بعد زبان سی داریم که دارم میخونم...بعدشم جاوا...برا همین نیاز به سی دارم
البته میگن یادگرفتن سی شاید خو سی خیلی به درد بخور نباشه ولی دانش برنامه نویسی شما رو میبره بالا و یادگیری زبان های دیگه رو اسون میکنه...البته میگن :چشمک:

dr.b4ne
یک شنبه 20 مرداد 1392, 23:35 عصر
خوب آقا یاد بگیرید یه حل شد انتهای عنوان تاپیک بزارید آدم وقتش تلف نشه دوستان ....

amir_80
دوشنبه 21 مرداد 1392, 13:18 عصر
خوب آقا یاد بگیرید یه حل شد انتهای عنوان تاپیک بزارید آدم وقتش تلف نشه دوستان ....

والا قبلا نوشتم بازم مینویسم
اقا دم همگی گرم... حل شد :تشویق: