# Native Code > برنامه نویسی با C > برنامه نویسی با زبان C و ++C >  معکوس کردن یک رشته

## mahmood3d

با عرض سلام 
من تازه شروع به برنامه نویسی با ++c کردم . می خواستم یه برنامه بنویسم که یه رشته ای رو بگیره و کلمه به کلمه اون رو معکوس کنه . مثل : ali reza که در خروجی ila azer چاپ کنه .
همین برنامه رو نوشتم ولی تمام رشته رو معکوس می کنه یعنی همون علیرضا رو به صورت azer ila چاپ می کنه .  :لبخند گشاده!: 
فقط زیاد با کدهای پیشرفته ننویسید تا من هم متوجه بشم . :خجالت:

----------


## A_Salimi

خوب این نباید کار چندان مشکلی باشه . . .

شما دو تا رشته با طول مناسب رو در نظر بگیر ، در رشته اول رشته اصلی رو که میخوای روش کار کنی رو وارد کنید حالا از یک حلقه for استفاده کنید و برای شرط حلقه هم strlen رشته اول رو در نظر بگیرید . فقط چیزی که هست اینه که باید در رشته خودتون با همین حلقه کاراکتر به کاراکتر جلو برید و کاراکتر ها رو در رشته دوم ذخیره کنید ، زمانی که به کاراکتر space ("") رسیدید رشته دوم به صورت معکوس در خروجی چاپ کنید و باز همین رویه رو تا انتهای رشته اول ادامه بدید .

----------


## radium

سلام دوست عزیز اینم واسه شما فقط آخر رشتت یه 0 وارد کن. 

 
#include "stdafx.h"
#include "fstream.h"
#include <string.h>
void main()
{
char s[20];
cin>>s;
while(1)
{
for(int i=strlen(s)-1;i>=0;i--)
 cout<<s[i];
cout<<" ";
cin>>s;
if(!strcmp(s,"0"))
   break;
}
}

----------


## mahmood3d

> خوب این نباید کار چندان مشکلی باشه . . .
> 
> شما دو تا رشته با طول مناسب رو در نظر بگیر ، در رشته اول رشته اصلی رو که میخوای روش کار کنی رو وارد کنید حالا از یک حلقه for استفاده کنید و برای شرط حلقه هم strlen رشته اول رو در نظر بگیرید . فقط چیزی که هست اینه که باید در رشته خودتون با همین حلقه کاراکتر به کاراکتر جلو برید و کاراکتر ها رو در رشته دوم ذخیره کنید ، زمانی که به کاراکتر space ("") رسیدید رشته دوم به صورت معکوس در خروجی چاپ کنید و باز همین رویه رو تا انتهای رشته اول ادامه بدید .


ممنون از اینکه کمکم کردین ولی اگه می شه بیشتر توضیح بدین . من الان این برنامه رو طوری نوشتم که کل رشته رو معکوس می کنه یعنی آخرین کاراکتر آرایه رو تو اولین کاراکتر آرایه دیگه ای کپی می کنم تا اولین کاراکتر آرایه اول که برنامه رو در زیر براتون می زارم . اگه می شه بگین این برنامه رو باید چه طوری تغییر بدم ؟

#include "iostream.h"
#include "conio.h"
#include "stdio.h"
#include "string.h"
void main(){
int z=0;
char a[255],b[255];
cin.get(a,255);
z=strlen(a)-1;
for(int i=0;i<255;i++)
b[z-i]=a[i];
puts(b);
getch();
}

----------


## A_Salimi

این هم برنامه ای که شما بهش نیاز داری
مطالعه کن اگه متوجه نشدی بگو توضیح بدم
با کامنت هایی واست توضیح دادم



#include "string.h"
#include "conio.h"
#include "iostream.h"
void main(){
char a[255];
//input string
cin.get(a,255);
//debug . . . necessary for final answer
strcat(a," ");
//define a lenth
int z=strlen(a);
int k=0;
//scan variable a
for(int i=0;i<z;i++){
char m=a[i];
//cheek for next word
if(m==' '){
for(int j=i;j>k;j--)
cout<<a[j-1];
k=i;
cout<<" ";
}
}
cout<<endl;
getch();
}

----------


## mahmood3d

دستور زیر چه کاری انجام می دهد و کار متغیر k چیست ؟

strcat(a," ");

----------


## A_Salimi

> دستور زیر چه کاری انجام می دهد و کار متغیر k چیست ؟


 
خوب strcat رو برای این گذاشتم که به رشته یک فاصله چسپونده بشه تا رشته آخر هم معکوس بشه . خودت میتونی این خط رو حذف کنی تا ببینی چه اتفاقی میفته ! مگر اینکه زمان وارد کردن رشته در آخر رشته هم یک فاصله خودتان به صورت دستی اضافه کنید.
و اما متغیر k :
در حقیقت فاصله مکان فاصله ها را در خود ذخیره میکند تا خروجی به درستی چاپ شود.

----------


## amir_cpp

البته نمی دونم قراره از توابع خود ++C استفاده بکنین یا نه، اما strrev در هدر string.h این کار رو انجام می ده.

----------


## mahmood3d

eshgh_82 عزیز 
دستت خیلی خیلی درد نکنه فهمیدم چی شد .



> البته نمی دونم قراره از توابع خود ++C استفاده بکنین یا نه، اما strrev در هدر string.h این کار رو انجام می ده.


قصد جسارت ندارم  :بوس:  ولی اولا می خواستم با کد نویسی همین کار رو انجام بدم ثانیا تیکه برنامه ای که در بالا گذاشتم کار همین strrev رو انجام می ده . :لبخند:

----------


## jalil_m

> با عرض سلام 
> من تازه شروع به برنامه نویسی با ++c کردم . می خواستم یه برنامه بنویسم که یه رشته ای رو بگیره و کلمه به کلمه اون رو معکوس کنه . مثل : ali reza که در خروجی ila azer چاپ کنه .
> همین برنامه رو نوشتم ولی تمام رشته رو معکوس می کنه یعنی همون علیرضا رو به صورت azer ila چاپ می کنه . 
> فقط زیاد با کدهای پیشرفته ننویسید تا من هم متوجه بشم .


 
دوست عزيز.شما ميتونيد از تابع strtok كه در هدرفايل string.h هست استفاده كنيد.
اين تابع يه رشته ميگيره و اون رو بر اساس كاراكتر خاصي (كه اينجا كاراكتر space ) هست به چند تكه تقسيم ميكنه و خروجي اون يه آرايه اي از تكه هاي رشته است.
بعد ميتونيد هر عنصر اين آرايه رو به برنامه اي كه خودتون نوشتيد ارسال كنيد تا هر كلمه رو جداگونه معكوس كنه.

----------


## dehqani

دوستان ببخشید تاپیک قدیمی رو میارم بالا ولی من اینو نوشتم جواب نمیده و داخل ویژوال 2013 هم نوشتم 
// ConsoleApplication1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "conio.h"
#include "iostream"
#include "string.h"
#include <stdio.h>

using namespace std;
    void main()
    {
        char a[255];
        cin.get(a, 255);
        strcat(a, " ");
        int z = strlen(a);
        int k = 0;
        for (int i = 0; i<z; i++){
            char m = a[i];
            if (m == ' '){
                for (int j = i; j>k; j--)
                    cout << a[j - 1];
                k = i;
                cout << " ";
            }
        }
        cout << endl;
        _getch();
}

----------


## کامبیز اسدزاده

این یک مثال تقریبا کاملی است امتحانش کنید : 



#include <iostream>
#include <string>


using namespace std;




void printReverse(const string& s)
{
	for (int i = s.length() - 1; i >= 0; --i) cout << s[i];
}


// the original string is reversed ...
// note: C++‎ strings are mutable ... i.e. can be modified (in place)
void reverse(string& s)
{
	int begin = 0, end = s.length() - 1;
	char tmp;
	while (begin < end) // swap begin and end ... char's
	{
		tmp = s[begin];
		s[begin++] = s[end];
		s[end--] = tmp;
	}
}


// a new local copy of a string is reversed
string getReverse(string s)
{
	int begin = 0, end = s.length() - 1;
	char tmp;
	while (begin < end) // swap begin and end ... char's
	{
		tmp = s[begin];
		s[begin++] = s[end];
		s[end--] = tmp;
	}
	return s; // returns a new copy of this reversed copy
}


int main()
{
	// 0 //
	string testStr = "abcdefghijklmnopqrstuvwxyz";
	cout << "(0) Original string: " << testStr << endl;


	// 1 //
	cout << "\n(1) After calling printReverse(testStr): ";
	printReverse(testStr);
	cout << endl;


	// 2 //
	// note: C++‎ strings are mutable ...
	reverse(testStr);
	cout << "\n(2) After calling reverse(testStr): " << testStr
		<< "\nThe original string is now reversed ..." << endl;


	// 3 //
	cout << "\n(3) After calling getReverse(testStr): " << getReverse(testStr)
		<< "\nThe new (temporary) copy is reversed ..."
		<< "\nbut the string passed in is still: " << testStr << endl;


	// 4 //
	cout << "\n(4) Or using reverse_iterator to print reversed: ";
	string::reverse_iterator rit = testStr.rbegin();
	string::reverse_iterator rit_end = testStr.rend();
	while (rit != rit_end) { cout << *rit; ++rit; }
	cout << "\nbut the string is still: " << testStr << endl;


	// 5 //
	cout << "\n(5) Or using const_reverse_iterator to print ... ";
	string::const_reverse_iterator crit = testStr.rbegin();
	string::const_reverse_iterator crit_end = testStr.rend();
	while (crit != crit_end) { cout << *crit; ++crit; }
	cout << "\nbut the string is still: " << testStr << endl;


	cout << "\nPress 'Enter' to continue ... " << flush;
	cin.get();
}

----------


## karkeabadi

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

----------


## mr.dkbaz

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

----------


## amirtork

سلام،
این مقاله رو مطالعه کنید،
http://www.cplusplus.com/articles/2wA0RXSz/
توی این مقاله، به شما نحوه ی جدا سازی یک رشته رو بر اساس یک کاراکتر خاص توضیح میده(با استفاده از تابع نوشته شده ی explode(const string& s, const char& c)، و بعد شما میتونید با استفاده از تابع خودتون و یا strrev در هدر فایل string.h، برای هر block از vector خروجی، کار نمایش معکوس هر عبارت انجام بدید.
اگر سوالی بود، در خدمتم.

----------


## mr.dkbaz

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

من خوذم به یه جاهایی رسیدم اینطوری ک من متوجه شده تابع strrev یک رشته رو معکوس میکنه فکر میکنم باید اینطوری باشه


#include "conio.h"
#include "iostream.h"
#include "string.h"
Int main(void)
{
char a;
cin<<a;
cout>>strrev(a);
Reutrn 0
}

ایا این کد من درسته؟ هدر هاشم درسته؟
ببخشید اگه اشتباه بوده

----------


## amirtork

سلام
در مورد تابع strrev درست متوجه شدید.
کدی هم که قرار دادید، درست هست، اما باید از آرایه ای از char استفاده کنید، و نه فقط از یک کاراکتر.
اما نکته ای که وجود داره این هست که strrev جزو توابع استاندارد نیست، و هر کامپایلر زبان c و C++‎ این رو نداره، به خاطر همین من پیشنهاد میکنم به جای این تابع، از تابع reverse در کتاب خانه ی algorithm استفاده کنید.
کار کرد این تابع به صورت زیر است:
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
    string str;
    cin>>str;
    reverse(str.begin(), str.end());
    cout<<str;
    return 0;
}

این کد، رشته ی str رو به صورت معکوس چاپ میکنه.

----------


## mr.dkbaz

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

----------


## amirtork

سلام
کد شما به دلیل استفاده از نسخه های قدیمی تر C++‎ در واقع از حالت استاندارد خارج هست و من باز هم پیشنهاد میکنم از نسخه های جدید تر استفاده کنید، با این حال، این کدی هست که من اشکالاتی رو که توش میبینم رفع کردم، اگر مشکل دیگه ای داشت بفرمایید:
#include "conio.h"
#include "iostream.h"
#include "string.h"
int main()
{
char a[10];
cin>>a;
cout<<strrev(a);
return 0;
}
1- return درست هست، نه Reutrn
2- علامت جریان ورودی برای cin به صورت cin>> هست نه cin<<
3- سی پلاس پلاس زبانی حساس به حروف بزرگ و کوچک هست، بنابراین باید در نوشتن دقت کنید، int درست هست و نه Int.

----------


## mr.dkbaz

ممنون واقعا کمک خیلی بزرگی کردید
ببخشید ک انقده سوال میکنم ولی سوال اخرمه
تو کد شما همونی ک خودتون پیشنهاد کردید این خط چیکار میکنه؟
using namespace std;
و میشه خواهش کنم در باره خط 
 reverse(str.begin(), str.end());
کمی توضیح بدید؟
چرا باید اون دوتا تابع ازشون استفاده بشه منضورمstr.begin و str.end هستش
ممنون

----------


## amirtork

using namespace std در این کد، در واقع داره محل تعریف cin و cout و string رو مشخص میکنه.
برای کنترل حجم انبوهی از توابع و کلاس ها، از مبحثی به نام فضای نام استفاده میکنیم، برای مثال اگر ما در برنامه ای، دو تابع با نام و آرگومان های یکسان داشته باشیم، برای مشخص کردن هر کدام، از فضای نام به خصوصی استفاده میکنیم، برای مثال:
#include <iostream>
#include <string>
#include <algorithm>

namespace first
{
    void sayHello()
    {
        std::cout<<"Hello!"<<std::endl;
    }
}

namespace second
{
    void sayHello()
    {
        std::cout<<"Hello!"<<std::endl;
    }
}
int main()
{
    //+++++++++++++
    first::sayHello();
    second::sayHello();
    //+++++++++++++
    return 0;
}

در کد بالا، با توحه به اینکه ویژگی های دو تابع کاملا شبیه به هم هست، برای اینکه در برنامه درچار مشکل نشویم، از دو فضای نام مختلف استفاده کردیم.
استفاده از فضای نام دو روش عمده داره:
1- اعلام در ابتدای برنامه مثل using namespace std;
2- اعلام در پشت موارد مورد استفاده از آن فضای نام، مثل std::cout
برای استفاده از روش دوم، باید قبل از عضو نظر در آن فضای نام، ابتدا اسم آن فضای نام رو بیاریم، بعد علامت تفکیک حوزه یا همون :: ، بعدش اسم عضو مورد نظر، مثل std::cin
در مورد اون دو تابع هم، کار اون دو تابع برگردوندن اشاره گر به ابتدا و انتهای رشته ی مورد نظر ما هستن.
str.begin() اشاره گری به ابتدای رشته و دیگری اشاره گری به انتهای رشته برمیگردونن، و علت استفاده هم این هست که تابع reverse برای انجام فرایند معکوس سازی، نیاز به دانستن محدوده ای هست که باید عمل معکوس سازی رو روش انجام بده، و از انجایی که ما میخواستیم کل رشته رو معکوس کنیم، پس دو اشاره گر به ابتدا و انتهای رشته فرستادیم.

----------


## samsamkhan

*سلام به کلیه دوستان
این دستوری که قرار دادم به صورت معکوس نشون نمیده
ببینید : <?php$str = "12345";
echo $implode;
؟>
این هم جواب نمیده: <?php
$str = "12345";
echo $strrev;
?>
فقط این جواب میده که به صورت برعکس نیست : <?php
$str = "12345";
echo $str;
?>
کسی میتونه منو راهنمایی؟*

----------


## sadrah87

#include <iostream>
#include <string.h>
#include <cstring>
using namespace std ;
int main()
{
    int i , a;
    char s[] = "matsah hedaznasaH ardaS naM";
    for ( i = strlen(s); i >=0 ; i--)
    {
        cout << s[i];
    }
} :بوس:  :لبخند:  :لبخند: فک کنم به حد کافی سادست!

----------

