ايران ويج

نسخه‌ی کامل: مشکل با رشته ها
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام

کد:
    int i = 2 ;
    char s2[4][20];
    char f[2][20];

    strcpy(s2[i],"C:\\");

    scanf("%c",f[i]);

    strcat(s2[i],f[i]);

    printf ("%s",s2[i]);

فکر کنم قانونا باید تو خروجی چاپ بشه C:\w ؛ البته فرض کردم تو ورودی w رو بزنیم ؛ ولی چرا هیچی تو خروجی نمیاد ؟؟؟ چه نکته ای توش هست که من سوادم نمیرسه ؟؟

ممنون
سلام

اول اینکه نمیدونم چرا از آرایه دو بعدی استفاده کردی، به هر حال

مشکلاش ایناس :
1 - ایندکس آرایه f فقط میتونه 0 باشه و 1 ولی شما i که برابر 2 هست رو قرار دادین و این خارج از محدوده f هست. البته ممکنه
مشکلی ایجاد نکنه ولی بهتره اینطور استفاده نشه

2 - اونجا که از strcat استفاه کردی که [f[i رو به [s2[i بچسبونی چنتا نکته رو فراموش کردی اول اینکه تابع strcat
دو تا رشته رو به هم وصل میکنه به این معنی که انتهای رشته حتما باید یه کاراکتر NULL یا صفر باشه
در صورتی که شما با تابع scanf مقدار [f[i رو از کاربر از نوع یک کاراکتر گرفتین و این تابع بعد گرفتن مقدار از کاربر
به دلیل اینکه یه کاراکتر هست دیگه انتهای اون NULL قرار نمیده پس موقع چسبوندن مشکل برات ایجاد میکنه
و این هم باز بستگی به کامپایلری داره که استفاده میکنی اگر کامپایلر مقدار اولیه صفر به آرایت داده باشه این
قسمت بدون مشکل هست ولی اگه غیر این باشه با مشکل مواجه میشی

3 - موقع استفاده از printf چون مقدار [s2[i معلوم نیست چی هست با توجه به مشکل قبلی که رشته دیگه انتها نداره
اینجا هم یا اصلا خروجی نمیگیری یا خروجی غیر از چیزی که انتظار داری میگیری یا اصلا به این دستور نمیرسی(به خاطر مشکل قبلی)

شاد باشید
سلام

اوه اوه ؛ چقدر مشکل داشت !!
از 2 بعدی واسه این استفاده کردم که از پس رشته هم بر بیاد،(واسه تمرین)

الان با توضیجات شما ، به f ؛ {0,0} نسبت دادم ؛ مشکل حل شد !!
-----------
فقط یه چند تا سوال دیگه ؛ از حرفای شما اینطور به نظر اومد که اگه یه رشته آخرش مشخص نباشه،نمیشه با strcat چسبوندش به یه رشته دیگه ، حالا بر عکسشم صادقه ؟ یهنی اگه آخره رشته X معلوم نباشه ، نمیشه با strcat به آخره X چیزی اضافه کرد ؟ اگه اینطوره ؛ بر فرض که ما نتونیم مقدلر اولیه بدیم به X ، چطور باید آخره X ؛ '\0' اضافه کرد ؟؟

سوال دوم اینکه ؛ مثلا :
کد:
S = "salam";
چطور میشه به وسط salam یه رشته دیگه اضافه کرد ؟؟ ( مثلا S = "sQQQQalam" )

ممنون
سلام

نقل قول: از 2 بعدی واسه این استفاده کردم که از پس رشته هم بر بیاد،(واسه تمرین)
آرایه یک بعدی هم میتونه رشته رو نگه داره، دو بعدی برای موقعی خوبه که چنتا رشته رو می خواین تو آرایه بریزین

نقل قول: فقط یه چند تا سوال دیگه ؛ از حرفای شما اینطور به نظر اومد که اگه یه رشته آخرش مشخص نباشه،نمیشه با strcat چسبوندش به یه رشته دیگه ، حالا بر عکسشم صادقه ؟ یهنی اگه آخره رشته X معلوم نباشه ، نمیشه با strcat به آخره X چیزی اضافه کرد ؟ اگه اینطوره ؛

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

نقل قول: اگه اینطوره ؛ بر فرض که ما نتونیم مقدلر اولیه بدیم به X ، چطور باید آخره X ؛ '\0' اضافه کرد ؟؟

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

کد:
s[10] = '\0';

نقل قول: چطور میشه به وسط salam یه رشته دیگه اضافه کرد ؟؟ ( مثلا S = "sQQQQalam" )

در این مورد من تابعی در C ندیدم باید خودت بسازی، یه راه میتونه این باشه که بیای رشته ای که باید سمت راست بره
حرف به حرف به اندازه اون طولی که می خای جابجاش کنی بعد بیای رشته که می خوای وسط جمله بیاد رو حرف به حرف قرار بدی
البته از قبل طول کل رشت باید به اندازه کافی جا داشته باشه

این در مورد C بود ولی اگه با ++C کار میکنی میتونی شی string و متد insert استفاده کنی لینک پایین یسری مثال دراین مورد داره
کد:
http://www.cplusplus.com/reference/string/string/insert.html

شاد باشید
سلام

دستتون درد نکنه ، عالی بود ،،

یه سوال دیگه ؛
نقل قول: s[10] = '\0';
چرا این رو به رشته نسبت میدیم ؛ خطا نمیگیره ؟؟ مگه نباید به رشته ها فقط با strcpy توشون رشته بریزیم ؟؟

ممنون
سلام

این از خصوصیات زبان ++C/C هست مشکلی ایجاد نمیکنه اینجوری به طور مستقیم هر کاراکتر رو میشه تغییر داد،

شاد باشید
سلام

استاد ببخشید همش سوال میکنما ! همش سوال واسم پیش میاد ؛ دلمم نیمیاد از تجربتون استفاده نکنم .

اول اینکه چطور میشه یه عدد رو ، به آخر رشته اضافه کرد ؟؟ یعنی با strcat چسبوندش به آخره یه رشته ؟؟
به عدد 48 واحد اضافه کردم واسه تبدیل به داده حرفی ؛ ولی بازم خطا گرفت ،و نتونست ؛؛ هم از دستور زیر استفاده کردم واسه تبدیل ؛ بازم خطا داد.
کد php:
int i 1;
char s[20] , s2;
strcpy(s,"C:\\");
s2 = ((chari); 
strcat(s,s2); 
یعنی این هم مشکلش معلوم نبودنه انتهای عدده ؟؟

دوم اینکه چطور میشه داخل رشته ، معادل کاراکتریه یه عدد رو ریخت ؟؟
مثلا با printf ؛ اگه %d بزنیم ، همون عدد چاپ میشه ؛ ولی با %c (اگه اشتباه نکنم) معادل کاراکتریش چاپ میشه

ممنون
سلام

ما کوچیک شما هم هستیم

در مورد این مشکل، الان s2 از نوع یک کاراکتر هست .و انتهایی نداره چون فقط یک حرف است باید s2 رو هم بصورت یک ارایه در نظر بگیری

در مورد این دستور:
کد php:
s2 = ((chari); 

اینجا همون مقدار یک وارد s2 میشه و تبدیل به کاراکتر نمیشه
همونطور که خودت گفتی باید به اضافه ی 48 کنی

همین کدت با کمی تغییرات اینجوری میشه
کد php:
int i 1;
char s[20] , s2[2];
strcpy(s,"C:\\");
s2[0] = ((char48); 
s2[1] = '\0';
strcat(s,s2); 

نقل قول: دوم اینکه چطور میشه داخل رشته ، معادل کاراکتریه یه عدد رو ریخت ؟؟
مثلا با printf ؛ اگه %d بزنیم ، همون عدد چاپ میشه ؛ ولی با %c (اگه اشتباه نکنم) معادل کاراکتریش چاپ میشه

در این مورد هم میتونی بصورت مستقیم در آرایه قرار بدی، یا میتونی از دستوری مثل sprintf استفاده کنی
مثلا کده بالا با استفاده از این تابع به این صورت میشه :
کد php:
int i 1;
char s[20];

sprintf(s"%s%c""C:\\"48); 

پارامتر اول خروجی این تابع هست که باید یک رشته باشه
پارامتر دوم فرمت رشته خروجی هست که مثل تا printf میمونه
مثلا من از s% و c% استفاده کردم یعنی یک رشته و یک کاراکتر که بهم چسبیدن
پارامتر سوم هم داده هایی است که باید در رشته خروجی قرار بگیرن

شاد باشید
سلام

Clap آقا تشکر ؛ سوالی داشتم میپرسم همینجا !!Biggrin