با سلام به اساتید
صورت مسئله این طوری که
برنامه ای بنویسید که دو رشته را گرفته باهم ادقام کند و خروجی را چاپ کند سپس تعداد کارکترها را بشمارد
در این برنامه از کتابخانه string .h استفاده نشود
#include <stdio.h>
#include <conio.h>
int main()
{
char a[100], b[100];
int i, j, n;
printf("Please enter first string :");
gets(a);
printf("Please enter second string :");
gets(b);
for (i = 0; a[i]; i++);
for (j = 0; b[j]; j++)
a[i + j] = b[j];
a[i + j] = 0;
printf("Merged string = %s\n", a);
for (n = 0; a[n]; n++);
printf("Length = %d\n", n);
getch();
return 0;
}
char a[100], b[100];
printf("Please enter first string :");
gets(a);
printf("Please enter second string :");
gets(b);
for (i = 0; a[i]; i++);
for (j = 0; b[j]; j++)
a[i + j] = b[j];
a[i + j] = 0;
printf("Merged string = %s\n", a);
for (n = 0; a[n]; n++);
printf("Length = %d\n", n);
میشه این رشته را با scanf هم گرفت یه چیزی غیره gets
بله، می توانید بجای ;(gets(a از ;(scanf("%s", a و بجای ;(gets(b از ;(scanf("%s", b استفاده کنید اما اگر اینکار رو انجام دهید فقط می توانید از کاربر یک کلمه بگیرید،
فرضا test . نمی توانید یک رشته که شامل کاراکتر فاصله است را از کاربر بگیرید. scanf به محض اینکه به فاصله برسد کارش را تمام می کند.
مهندس جان چند تا سوال دیگه
چرا در حلقه for اول از سمی کالن استفاده نکردی
این دستور را لطفا دقیق برام توضیح بده
a[i + j] = b[j]
for (i = 0; a[i]; i++);
for (i = 0; a[i]; i++)
{
};
for (j = 0; b[j]; j++)
{
a[i + j] = b[j];
}
for (j = 0; b[j]; j++)
a[i + j] = b[j];
if (x > y)
{
i++;
}
if (x > y)
i++;
for (i = 0; i < 10; i++)
x++;
for (i = 0; i < 10; i++);
x++;
for (i = 0; a[i]; i++);
حلقه می تونه بجز اون ++i (تغییر شمارنده حلقه) بدون کد برای اجرای داخل حلقه باشه :
کد:for (i = 0; a[i]; i++);
این حلقه مشابه این حلقه است :
کد:for (i = 0; a[i]; i++) { };
اما حلقه می تواند بجز تغییر شمارنده حلقه، کدی هم برای اجرای داخلش داشته باشد :
کد:for (j = 0; b[j]; j++) { a[i + j] = b[j]; }
اگر اون کد داخل حلقه فقط یک سطر باشد، می توانیم { و } را ننویسیم، یعنی اینطوری هم همان کد قبلی است :
کد:for (j = 0; b[j]; j++) a[i + j] = b[j];
همانطور که این کد :
کد:if (x > y) { i++; }
معادل این کد است :
کد:if (x > y) i++;
توجه داشته باشید که یک ; اضافی می تواند نتیجه اجرای کد را به کلی عوض کند. فرضا این کد یک حلقه است که ++x داخلش اجرا می شود، چون حلقه 10 بار تکرار می شود
مقدار x هم 10 بار افزایش می یابد :
کد:for (i = 0; i < 10; i++) x++;
اما اگر یک ; بعد از ( حلقه اضافه کنید، دیگر ++x داخل حلقه نیست و فقط یکبار بعد تمام شدن تمامی 10 دور حلقه اجرا می شود و در نتیجه x فقط یکبار افزایش می یابد :
کد:for (i = 0; i < 10; i++); x++;
در کد برنامه ما می خواستیم رشته b رو به انتهای رشته a اضافه کنیم، برای اینکار اول باید بدانیم که انتهای رشته a کجا است.
در حلقه اول ما i را آنقدر جلو می بریم تا به انتهای a برسد :
کد:for (i = 0; a[i]; i++);
حالا فرضا اگر رشته داخل a برابر test باشد، مقدار i برابر 4 خواهد بود و [a[0 و [a[1 و [a[2 و [a[3 پر است و خانه [a[4 اولین خانه خالی است.
اکنون باید رشته b را باید در a و از خانه خالی [a[4 به بعد بنویسیم. [a[4 همان [a[i است چون i برابر 4 است.
کد [a[i + j] = b[j مقدار داخل خانه j ام را از b به a منتقل می کند. i + j برای این است که از خانه i ام به بعد نوشته شود. یعنی مقدار خانه های قبلی همانطور دست نخورده حفظ شوند.
اگر بجای [a[i + j می نوشتیم [a[j ، هر رشته ای که در a بود از همان خانه 0 به بعد باز نویسی می شد و چیزی از a باقی نمی ماند، می شد مثل b
اگر بجای [a[i + j می نوشتیم [a[i ، کاراکتر های رشته b همه شون روی خانه [a[4 نوشته می شدند و طول a فقط یک کاراکتر بیشتر می شد.
printf("\n rotbhe shoma:%c",a,'A')
printf("\n rotbhe shoma:%c",'A')