افزونه 1 مشکل با پر کردن آرایه اشاره گرهای رشته ای

MPERSIA4

Member
سلام
من با این کد به مشکل خوردم
هر کاری میکنم نمیتونم حلش کنم

[CPPS]
#include<iostream>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
int search(char *[30],char *,int);
void print(int [],int);
void main()
{
char ans='y';
do
{
int i,len=-1,c;
int n[29];
char *list[20],*ch;
system("cls");
cout<<"\n Enter some name and phone number , End (.) : ";
for(i=0;i<=19;i++)
{
cout<<"\n Name["<<i+1<<"] = ";
cin>>*list;
fflush(stdin);
if(*list=='.')
i=30;
else
{
cout<<"\n Phune number["<<i+1<<"] = ";
cin>>n;
len++;
}
}
do
{
system("cls");
cout<<list[3];
cout<<"\n Enter a name for search : ";
cin>>*ch;
fflush(stdin);
c=search(list,ch,len);
cout<<c<<endl;
print(n,c);
cout<<"\n Do you want enter another name for search ?(y/n)";
cin>>ans;
}while(ans=='y');
cout<<"\n Do you want enter another names and phone numbers ?(y/n)";
cin>>ans;
}while(ans=='y');
}
int search(char *s[20],char *n,int len)
{
for(int i=0;i<=len;i++)
if(!strcmp(s,n))
return i;
else if(i==len)
return -1;
}
void print(int n[],int c)
{
if(c>=0)
cout<<"\n Exist in table"<<"\n phone number is : "<<n[c];
else
cout<<"\n Not exist in table";

}
[/CPPS]

توضیحات :
تو این کد اشاره گر LIST هر بار یه اسم میگیره و بعدش ارایه N یه عدد مثلا شماره تلفن دریافت میکنه
پایان ورود اطلاعات یا با '.' هست یا با تموم تموم شدن اشاره گر LIST

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

من این کد رو با رشته ها بصورت ساده و بدون اشاره گر نوشتم و مشکلی نداشت ولی با اشاره گر نتونستم
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام
من با این کد به مشکل خوردم
هر کاری میکنم نمیتونم حلش کنم

1) بهتره از void main استفاده نکنید، برخلاف int main استاندارد نیست :
کد:
int main()
{
.
.
.
    return 0;
}
2) شما یک آرایه ای از اشاره گر ها ساخته اید اما این اشاره گر ها به کجا اشاره می کنند؟ معلوم نیست. فراموش نکنید که cin صرفا مقدار در حافظه قرار می دهد، حافظه ایجاد نمی کند.
تا زمانی که برای رشته ها حافظه تخصیص ندهید و این اشاره گر ها رو به اون حافظه ها اشاره نداده اید cin کردنشان درست نیست :
کد:
            list[i] = new char[20];
در مورد char *ch هم همینطور :
کد:
            ch = new char[20];

3) مقدار داخل [list[i یک *char است، همانطور که [char s[100 و char *s یک رشته است. اگر بنویسید cin >> *s بجای یک رشته فقط یک کاراکتر دریافت می کنید.
همانطور که در مورد ;[char s[100 از ;cin >> s استفاده میشه در مورد [list[i هم نباید روال متفاوتی بکار ببرید.
وقتی می نویسید [cin>>*list[i اون * باعث میشه که بجای یک رشته یک کاراکتر دریافت بشه، کاراکتر های بعدی دست نخورده باقی می مانند.
در مورد cin>>*ch هم همین مورد باعث میشه که صرفا یک کاراکتر دریافت کنه.

4) بهتره برای مقایسه رشته از strcmp استفاده کنید :
کد:
            if(!strcmp(list[i],"."))
                i=30;

کد:
#include<iostream>
#include<conio.h>
#include<string.h>
#include<stdlib.h>

using namespace std;

int search(char *[30],char *,int);

void print(int [],int);

int main()
{
    char ans='y';
    do
    {
        int i,len=-1,c;
        int n[29];
        char *list[20],*ch;
        system("cls");
        cout<<"\n Enter some name and phone number , End (.) : ";
        for(i=0;i<=19;i++)
        {
            cout<<"\n Name["<<i+1<<"] = ";
            list[i] = new char[20];
            cin>>list[i];
            fflush(stdin);
            if(!strcmp(list[i],"."))
                i=30;
            else
            {
                cout<<"\n Phone number["<<i+1<<"] = ";
                cin>>n[i];
                len++;
            }
        }
        do
        {
            system("cls");
            cout<<list[3];
            cout<<"\n Enter a name for search : ";
            ch = new char[20];
            cin>>ch;
            fflush(stdin);
            c=search(list,ch,len);
            cout<<c<<endl;
            print(n,c);
            cout<<"\n Do you want enter another name for search ?(y/n)";
            cin>>ans;
        }while(ans=='y');
        cout<<"\n Do you want enter another names and phone numbers ?(y/n)";
        cin>>ans;
    }while(ans=='y');
    return 0;
}

int search(char *s[20],char *n,int len)
{
    for(int i=0;i<=len;i++)
            if(!strcmp(s[i],n))
                return i;
            else if(i==len)
                return -1;
}

void print(int n[],int c)
{
    if(c>=0)
        cout<<"\n Exist in table"<<"\n phone number is : "<<n[c];
    else
        cout<<"\n Not exist in table";

}
 

MPERSIA4

Member
خیلی ممنون از جوابتون
حل شد
ولی ی سوال دارم
اینکه چرا علامت ! پشت strcmp هست؟
چه کاری انجام میده؟
این تیکه کد رو تو کتاب پیدا کردم ولی نمیدونم چرا اینجوریه!!!!


کد:
if(!strcmp(s[i],n))
 
آخرین ویرایش:

the_king

مدیرکل انجمن
خیلی ممنون از جوابتون
حل شد
ولی ی سوال دارم
اینکه چرا علامت ! پشت strcmp هست؟
چه کاری انجام میده؟
این تیکه کد رو تو کتاب پیدا کردم ولی نمیدونم چرا اینجوریه!!!!


کد:
if(!strcmp(s[i],n))
در زبان های C++ / C هر عبارتی که مقدارش 0 باشه false ئه و هر مقداری غیر از 0 بصورت true تفسیر میشه.
عملگر ! عبارت بعد از خودش رو Not می کنه، یعنی true رو false می کنه و false رو true
فرضا شرط (if (n زمانی برقرار است که n هر عددی غیر از 0 باشه.
شرط (if (!n زمانی برقرار است که n برابر 0 باشه.

strcmp وقتی دو رشته رو مقایسه می کنه زمانی 0 بر می گردونه که هر دو رشته برابر باشند وگرنه یک مقداری غیر از 0 بر می گرداند.
پس شرط ((...)if (strcmp زمانی برقرار است که دو رشته برابر نباشند.
و شرط ((...)if (!strcmp زمانی برقرار است که دو رشته برابر باشند.
 

جدیدترین ارسال ها

بالا