PDA

View Full Version : مشكل در كد C



mafia5
جمعه 08 شهریور 1387, 19:59 عصر
سلام

ببخشيد اما من اين كد رو براي اين نوشتم تا 2 رشته رو از ورودي گرفته و بعد رشته دوم رو در ادامه رشته اول قرار بده اما ارور ميده و نميدونم مشكل از كجاست.:گریه::گریه:

ممنون ميشم كمكم كنيد.:تشویق:




#include<stdio.h>
#include<conio.h>
#include<string.h>
void elhagh(char str1[50],char str2[40]);
void output(char []);
void main()
{
int s1,s2,i,count;
clrscr();
char str1[50],str2[40],ch;
puts("now insert your first strings:");
gets(str1);
puts("now insert your second string:");
for(i=0;i<50;i++){
while((ch=getch())!='\r'){
str2[i]=getche();
s2=count++;
}//end of while
}//end of for
puts("your strings are:");
puts("str1\nstr2");
elhagh(str1,str2);
getch();
clrscr();
}//end of void main

//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

void elhagh(char str1,char str2)
{
char str3[100];
int i=0,j=0;
while(str1[i]!='\0'){
i+=1;
}//end of while
while(str1[i]=='\0'&&i<50){
ctrcpy(str1[i],str2[j]);
i++;
j++;
}//end of while
strcpy(str3,str1);
output(str3);
}//end of void elhagh

//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

void output(char str3)
{
puts("your strings made this:");
puts("\nstr3");
}//end of output

//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

MOHSEN8000
جمعه 08 شهریور 1387, 23:01 عصر
اول از همه یه جای برنامه که تابع strcpy رو فراخوانی کردی اشتباه نوشتی اسم تابع رو. ( این اشکال ها رو خود کامپایلر بهت می گه باید حواست باشه تا رفعشون کنی. ) رشته رو که می خواهی به تابع پاس بده باید معلوم کنی که رشته هست ( تو توی معرفی تابع نوشتی که تابع elhagh یه تابع هست که دو تا کاراکتر می گیره در حالی که بعدا توی فراخوانی بهش دو تا رشته دادی !!!) توی فراخوانی تابع می تونی فقط از اسم str1 یا str2 استفاده کنی . چون تابع main می دونه که این دوتا رشته هستن. ولی تابع های دیگه تمام متغیرهاشون محلی هست. یعنی اصلا توی تابع elhagh متغیری به اسم str2 اصلا هیچ ربطی نداره به str2 که توی main هست. ( یعنی لزومی نداره که بنویسی


void elhagh(char str1[],char str2[])
بلکه حتی مثلا اگه بنویسی

void elhagh(char s1[],char s2[])
هم هیچ فرقی نداره چون متغیر های توابع محلی هستند.
راستی یه دلیل این که گاهی به این مشکلات بر می خوری به نظرم اینه که می خوای توی یه مدت کم ، همه چیزو یاد بگیری. اگه بتونی آهسته بری و به جاش مطالب رو عمیق تر بخونی دیگه بیشتر وقت ها می تونی خودت مشکلات خودتو حل کنی.

MOHSEN8000
جمعه 08 شهریور 1387, 23:29 عصر
ضمنا چرا برای گرفتن رشته دوم از getch استفاده می کنی؟ آخه این تابع خیلی اشکالات زیادی داره برای این کار. یکیش مثلا اینه که این تابع ، کاراکتر گرفته شده را نمایش نمی ده. و معمولا هم برای انتها برنامه ( pause ) ویا مثلا سوال در مورد ادامه برنامه کاربرد داره نه این جا!

mafia5
شنبه 09 شهریور 1387, 19:53 عصر
ضمنا چرا برای گرفتن رشته دوم از getch استفاده می کنی؟ آخه این تابع خیلی اشکالات زیادی داره برای این کار. یکیش مثلا اینه که این تابع ، کاراکتر گرفته شده را نمایش نمی ده. و معمولا هم برای انتها برنامه ( pause ) ویا مثلا سوال در مورد ادامه برنامه کاربرد داره نه این جا!

ميدونم اما ميخواستم طول رشته رو مشخص كنم كه فكري به ذهنم نرسيد:گریه:
اگه يه كد ديگه به جاش بديد ممنون ميشم.

در مورد سرعت هم حق با شماست اما حالا ديگه فقط دارم مثال حل ميكنم و برنامه مينويسم تا برام خود به خود حل بشه.:چشمک:

ممنون از راهنماييتون.:قلب:

Salar Ashgi
شنبه 09 شهریور 1387, 20:15 عصر
کد بهتر برای گرفتن رشته ها از ورودی !!!


#include <iostream>
#include <conio>
int main(){
char a[20];
cin.getline(a,20); //to get string from input
cout<<a<<endl;
getch();
}

موفق و پیروز باشید !!!

mafia5
شنبه 09 شهریور 1387, 21:32 عصر
ميشه اينو به C ترجمه كنيد؟



#include <iostream>
#include <conio>
int main(){
char a[20];
cin.getline(a,20); //to get string from input
cout<<a<<endl;
getch();
}

يه خرده گير كردم.

mafia5
شنبه 09 شهریور 1387, 21:35 عصر
در اين قسمتي كه ميزارم مشكلي هست؟
آخه تو كامپايلرم يه مشكلايي ميگيره كه نميفهمم.مخصوصآ تو قسمت كپي كردن رشته ها.
ممنون.


while(str1[i]!='\0'){
i+=1;
}//end of while
while(str1[i]=='\0'&&i<50){
ctrcpy(str1[i],str2[j]);
i++;
j++;
}//end of while

Salar Ashgi
شنبه 09 شهریور 1387, 22:07 عصر
در اين قسمتي كه ميزارم مشكلي هست؟
آخه تو كامپايلرم يه مشكلايي ميگيره كه نميفهمم.مخصوصآ تو قسمت كپي كردن رشته ها.
ممنون.


while(str1[i]!='\0'){
i+=1;
}//end of while
while(str1[i]=='\0'&&i<50){
ctrcpy(str1[i],str2[j]);
i++;
j++;
}//end of while


===================================

دوست عزیز کد های سی پلاس پلاس فرق چندانی با سی ندارند ،

(به جز printf,scanf,malloc,free, ... در سی ) ( cout, cin, new , delete , در ++C )

کدی که نوشتم تو سی هم استفاده میشه ، در ضمن اسم تابع الحاق دو رشته Strcpy

نام داره ، ولی شما نوشتید CtrCpy ??? در ضمن کامپایلرتون چیه ؟ Borland ، Dev ، یا ...

mafia5
شنبه 09 شهریور 1387, 22:14 عصر
من از بورلند استفاده ميكنم.
و در همون خط هايي كه كاراكتر رشته رو با NULL مقايسه كردم خطا ميده.(من ميخوام بفهمم كدوم كاراكتر رشته مساوي NULL است)

در مورد strcpy هم ممنون.

و من مفهوم
getline(a,20)
رو نيفهمم.

Salar Ashgi
شنبه 09 شهریور 1387, 23:23 عصر
من از بورلند استفاده ميكنم.
و در همون خط هايي كه كاراكتر رشته رو با NULL مقايسه كردم خطا ميده.(من ميخوام بفهمم كدوم كاراكتر رشته مساوي NULL است)

در مورد strcpy هم ممنون.

و من مفهوم
getline(a,20)
رو نيفهمم.

========================================

کد
cin.getline(a,20) یعنی یک رشته بگیر با حداکثر طول 19 (کاراکتر بیستم

NULL ) و آنرا در رشته (آرایه ای از کاراکتر ها) بنام a قرار بده !!!!

اگه این برنامه رو (الحاق دو رشته) میخواین میتونم تو سی پلاس پلاس بنویسم !!!!:لبخندساده:

bsng110
یک شنبه 10 شهریور 1387, 09:20 صبح
هوالحکیم
سلام
در ابتدا بگویم که یک تابع به نام strcat وجود دارد که این تابع مسئولیت الحاق (یا Concat) دو رشته را بر عهده دارد و تابع strcpy فقط رشته ای را در رشته ای دیگر کپی می کند. در مورد این توابع در تاپیک http://barnamenevis.org/forum/showthread.php?t=119593 توضیح داده ام و می توانید به تابع strcat یعنی تابع ششم از قسمت الف مراجعه کنید و توضیحات آن را بخوانید. اما در مورد پیاده سازی این تابع نیز می توانید از کدهای زیر استفاده کنید. همچنین هزاران حالت دیگر برای پیاده سازی این توابع وجود دارد:


#include <stdio.h>
#include <conio.h>
#include <string.h>
char *Strcat1(char *dest, const char *src)
{
strcpy(dest+strlen(dest),src);
return dest;
}
char *Strcat2(char *dest, const char *src)
{
char *result=dest;
dest+=strlen(dest);
while(*src)
*dest++=*src++;
return result;
}
void main()
{
char str1[5],str2[8];
scanf("%4s%7s",str1,str2);
printf("%s\n",Strcat1(str1,str2));
_getch();
}

برای خواندن رشته ها هم می توانی از مثال بالا استفاده کنی. معادل تابع cin.getlince زبان ++C تابع scanf زبان C می باشد که باید فیلد طول را نیز بنویسی. در تاپیک هفتم http://barnamenevis.org/forum/showthread.php?t=107567&highlight=scanf در مورد فیلد طول و میدان و ... توضیح داده ام که می توانید جهت اطلاعات بیشتر به این قسمت مراجعه کنید.
تا یادم نرفته، باید بدونید که در مثال بالا، scanf به فضا های خالی حساس است یعنی هیچگاه رشته "a cat" را نمی توانید در str2 یا هر رشته دیگری حتی str1 ذخیره کنید چرا که به محض رسیدن به فضای خالی(در این مثال بلانک)، تابع scanf خواندن را متوقف می کند و بقیه ورودی را برای رشته بعدی در نظر می گیرد. برای رفع این مشکل نیز می توانید از [] در رشته فرمت مربوط به s% استفاده کنید که فکر کنم در همان تاپیک بالا در مورد این موضوع نیز توضیح داده ام.
امیدوارم مشکل شما حل شده باشد.
یا علی
حق نگهدارتان

mafia5
یک شنبه 10 شهریور 1387, 10:15 صبح
ممنون
اما تو این خط مشکلش چیه که خطا میده؟توی شرطش میگه غیر قابل اجرا.


while(str1[i]=='\0'&&i<50)

bsng110
یک شنبه 10 شهریور 1387, 11:51 صبح
هوالحکیم.
سلام.
لطفاً عنوان و متن خطا را بگویید. شاید عیب از آنجاست که به قول دوست عزیزمون، هنوز str1 را به صورت char str1 نوشته اید در صورتی که باید بنویسید char *str1 یا []char str1. در ثانی، اون کد اصلاً اشتباه و بی معنی بود! شما نباید از اون کد استفاده کنید. ببخشید که فرصت ندارم، خطا های آن کد را بگویم ولی همینقدر بدانید که حداقل 5-6 مورد اشتباه در آن کد شما وجود داشت.
یا علی.
حق نگهدارتان

mafia5
یک شنبه 10 شهریور 1387, 12:52 عصر
من خطوطي رو كه ارور ميده همراه با ارورش رو نوشتم.
اگه ميشه كمك كنيد.



#include<stdio.h>
#include<conio.h>
#include<string.h>
void elhagh(char str1[50],char str2[40]);
void output(char str3[100]);
void main()
{
int s1,s2,i,count;
char str1[50],str2[40],ch;
puts("now insert your first strings:");
gets(str1);
puts("now insert your second string:");
gets(str2);
puts("your strings are:");
puts("str1");
puts("str2");
elhagh(str1,str2);
getch();
clrscr();
}//end of void main

//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

void elhagh(char str1,char str2)
{
char str3[100];
int i=0,j=0;
while(str1[i]!=={0}){(invalid indirection,expression syntax)
i++;
}//end of while
while(str1[i]=={0}&&i<50){
strcpy(str1[i],str2[j]);
i++;
j++;
}//end of while
strcpy(str3,str1);(while statment missing)
output(str3);
}//end of void elhagh

//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

void output(char str3[100])
{
puts("your strings made this:");
puts("str3");
}//end of output

//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

Salar Ashgi
یک شنبه 10 شهریور 1387, 13:16 عصر
با سلام به شما دوست گرامی ،

بجای کد زیر :


while(str1[i]!=={0})

اشتباه : ==! بجای =! و استفاده از {0}

کد درست تر:



while(str1[i]!=NULL)
or
while(str1[i]!='\0')


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

ورودی تابع رو یک کاراکتر کردین !!!


void elhagh(char str1,char str2)

رشته ها در سی پلاس پلاس : یا بصورت * char و یا بصورت آرایه ای از کاراکتر ها هستن !!

پس باید بنویسین :



char * str1;
یا
char str1[50];


و مشکل تابع
strcpy(str3,str1); اینه که شما میخواین یک کاراکتر (str1)

رو در یک رشته (آرایه کاراکتری) کپی کنید که این کار توسط این تابع اشتباه است ، چراکه این

تابع دو رشته رو در هم کپی میکنه از نوع * char و نه کاراکتر رو توی رشته !!!!

موفق و پیروز باشید !!! اگه باز اشکالی بود ، در خدمتم !!! اینا اشکال های اصلی برنامه بود !!

mafia5
یک شنبه 10 شهریور 1387, 13:52 عصر
ممنون
كد درستشم گزاشتم تا اگه كسي خواست بخونه.


#include<stdio.h>
#include<conio.h>
void elhagh(char str1[100],char str2[100]);
void output(char str1[100]);
void main()
{
int s1,s2,i,count;
char str1[100],str2[100],ch;
puts("now insert your first strings:");
gets(str1);
puts("now insert your second string:");
gets(str2);
puts("your strings are:");
puts(str1);
puts(str2);
elhagh(str1,str2);
getch();
clrscr();
}//end of void main

//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

void elhagh(char str1[100],char str2[100])
{
int i=0,j=0;
while(str1[i]!='\0'){
i++;
}//end of while
while(str1[i]=='\0'){
str1[i]=str2[j];
i+=1;
j+=1;
}//end of while
output(str1);
}//end of void elhagh

//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

void output(char str1[100])
{
puts("your strings made this:");
puts(str1);
}//end of output

//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\