یک سوال راجع به رشته ها در C++ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

یک سوال راجع به رشته ها در C++

+1 امتیاز

سلام 

پاسخ سوال زیر رو میخواستم. ممنون از شما.

خروجی حاصل از اجرای

proce  ("ABCD")

 چه می شود؟

void proce (char *s) {
for (int  n=0 ; s[n] != '\0' ; n++)
for (int  i=0 ; i<n ; ++i)
s[i]=s[n-i];
cout << s;
}

 

1) "ABCD"

2) "DCBA"

3) " "

4) "DBCD"

سوال شده آبان 14, 1393  بوسیله ی cyber (امتیاز 38)   4 8 11
چرا امتحان نمی‌کنید:
http://cpp.sh/3m5
سلام دوستان!
برای خط ("proce("ABCD یه هشداری می ده:
[warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings
می شه در این مورد یه کم توضیح بدید؟
ضمنا پس از اجرای برنامه با خطای (Segmentation fault (core dumped مواجه می شم... زمانی که داره [s[0] = s[1-0 اجرا می شه...
(gcc version 4.8.3)

3 پاسخ

+2 امتیاز

این کد اشکال اساسی داره چون حافظه‌ای که در تابع استفاده می‌شه حافظۀ لیتراله و قابل تغییر نیست. کد باید به این شکل تغییر کنه:


// Example program
#include <iostream>
#include <string>
using namespace std;

void procedure (char* s) 
{
    for(int  n = 0 ; s[n]  !=  '\0' ; n++)
        for(int  i = 0; i < n; i++)
        {               
           s[i]=s[n - i];
        }
    cout<< s;
}

int main()
{
    char s[10] = "ABCD";
    procedure(s);
    return 0;
}

هر چند خروجی در هیچ گزینه‌ای نیست: http://rextester.com/UTW75398

 
پاسخ داده شده آبان 15, 1393 بوسیله ی irancplusplus (امتیاز 203)   1 2 14
ویرایش شده آبان 15, 1393 بوسیله ی irancplusplus
آها این درسته!... خطای منطقی ای هم بود!...

ABCD

0 ? ABCD

1 0 BBCD

2 0 CBCD
2 1 CBCD

3 0 DBCD
3 1 DCCD
3 2 DCCD
+1 امتیاز

شما از literal string استفاده کردید که خودش ثابته و همچنین r value هم هستش پس اگر به هر طریقی قصد دارید ثابت را تغییر بدید خطای زمان کامپایل  دریافت می کنید.

برای جلوگیری از اینکار می تونید رشته را به صورت زیر تعریف کنید.

char str[] = "ABCD";

 

پاسخ داده شده آبان 15, 1393 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
0 امتیاز

 

c++, رشته, c

دوستان سوالی که مطرح کردم به صورت بالا هست و پاسخی که کتاب داده به صورت زیره: البته سوال به شکل کاملا درست (از نظر کامپایل کردن) مطرح نشده و بعضی جاها ";" اشتباه اومده، اما کلیت سوال مهمه که جوابشو زده گزینه ۳. حالا من هر جور حساب میکنم ۳ نمیشه به نظر شما پاسخ اشتباه نیست؟ اونجا که گفته در حلقه اول n=4 میشه به نظرم اشتباهه.

 

 

c++, رشته, c

پاسخ داده شده آبان 15, 1393 بوسیله ی cyber (امتیاز 38)   4 8 11
ویرایش شده دی 30, 1393 بوسیله ی haniye sarbazi
خب سوال و جوابش اشتباهه چون اجرای برنامه چیز دیگه‌ای رو نشون می‌ده. در دانشگاه خیلیا به فکر درس دادن هستند ولی زیاد برنامه نمی‌نویسن. این همه نمودار و جدول برای جواب کشیده شده اما برنامه یه بار اجرا نشده.
literal string تو c++11 معرفی شده و این طریق استفاده ازش را ممنوع کرده ولی همین کد بالا به راحتی در کامپایلر های همان زمان(81) که قاعدتاً turbo c++ بوده کار میکرده ولی بازهم جای تعجبه که چرا جواب تو لیست نیست.
توی کامپیالرهای بورلند از جمله توربو c حتی ورژن‌های اخیرش رشته‌های لیترال را می‌شه تغییر داد و فقط هشدار می‌ده. کلا کامپیالر بورلند تا بتونه هشدار می‌ده حتی خطاهای لینکیج هم هشداره. اما قبلا هم استاندارد نبود و کد بالا از نظر استاندارد ++C خطا داره.
حالا بورلند منحل شده ولی نمی‌دونم اعوان و اعقابش هنوز در این مورد هشدار می‌دن یا خطا می‌گیرن.
...