PDA

View Full Version : مشكل با آرايه ای از رشته ها



<برنامه نویس>
شنبه 17 مهر 1389, 23:47 عصر
سلام دوتسان ميشه بگيد مشكل اينبرنامه چيه كا رنميكنه


#include <stdio.h>
#include <string.h>
void main()
{
char famil[20][50];
int snum;

strcpy(famil[0], "Name1");
strcpy(famil[1], "Name2");
strcpy(famil[2], "Name3");
strcpy(famil[3], "Name4");
strcpy(famil[4], "Name5");
strcpy(famil[5], "Name6");

printf("please enter number Student?");
scanf("%d",&snum);

if (snum <31 ){
printf("Family Student : %c",&famil[2]);
}
else {
printf("please enter valid number day ...");
}


}

بعد راه ديگه برا يكا ركردن با ارايه ها وجود نداره چه نيازي به strcpy هستش

mehdi.mousavi
یک شنبه 18 مهر 1389, 00:13 صبح
سلام.
تابع strcpy مدتهاست که deprecate شده (برای دیدن لیست توابع CRT منقضی شده، به این آدرس (http://msdn.microsoft.com/en-us/library/ms235384%28VS.80%29.aspx) رجوع کنید). شما باید از strcpy_s که نسخه ایمن اون تابع هستش استفاده کنید (برای اطلاعات بیشتر به نوشته های Brian Sullivan و Michael Howard در مورد SDL مراجعه کنید).

مشکل دوم کد شما اینه که فرض کرده اید برنامه شما همواره در شرایط MBCS کامپایل میشه. خوب، سالهاست که دیگه نباید این فرض رو کرد. بنابراین بهتره همواره جای char (یا دیگر متغیر های مربوطه) از نسخه T ی اونها (مثل TCHAR) استفاده کنید تا در صورت نیاز بشه برنامه رو با تغییر یکی دو سوئیچ هنگام کامپایل بصورت Unicode کامپایل کرد.

مشکل سوم این کد، عدم استفاده از Initializer هاست. شما براحتی میتونستید آرایه مورد نظر رو بدین شکل پر کنید:

char famil[20][50] = {"Name1", "Name2", "Name3", "Name4", "Name5", "Name6"};

مشکل بعدی، توی این خطه:

printf("Family Student : %c",&famil[2]);

اینجا اون عدد 2 به چه معناست و هدفتون چی بوده؟ اگر میخواستید Family Name رو چاپ کنید، چرا از %s استفاده نکرده اید و & رو از جلوی نام متغیر حذف نکرده اید:

printf("Family Student : %s", famil[2]);

در نهایت، شما نباید بدون Validate کرده User Entry به این سادگی به اندیس دوم famil دسترسی پیدا کنید. ابتدا باید مطمئن بشید که حداقل 3 تا famil دارید، سپس به خونه 2 (منظورم Zero-Based هستش) دسترسی پیدا کنید. اگر هم مطمئنید که حداقل سه عنصر در آراه همواره خواهید داشت، باید این مساله رو با آوردن assert در کد نشون بدید.

موفق باشید.

<برنامه نویس>
یک شنبه 18 مهر 1389, 09:41 صبح
مرسي -خيلي توضيحاتتون كامل بود -مرسي -مشكلم حل شد با راهنمايي شما ببخشيد يه سوال ديگه
%d %c %f رو ميدنوم چيه يشه بگيد %s چيه واسه كاركاتر نبايد از %c استفاده كرد با تشكر

mehdi.mousavi
یک شنبه 18 مهر 1389, 09:52 صبح
مرسي -خيلي توضيحاتتون كامل بود -مرسي -مشكلم حل شد با راهنمايي شما ببخشيد يه سوال ديگه
%d
%c
%f
رو ميدنوم چيه يشه بگيد %s چيه واسه كاركاتر نبايد از %c استفاده كرد با تشكر

سلام.
بله، c نشون دهنده Character هستش (دقیق بخوام بگم، single-byte char). اما مگه شما می خواهید یه تک کاراکتر از عنصر N ام رو نشون بدید؟ اگر هدفتون نشون دادن کل اون رشته هستش، باید از s (دقت کنید، s کوچک زدم به معنای single-byte-character-string یا همون کاراکترهای 1 بایتی) استفاده کنید. اگر هدفتون چاپ رشته Unicode باشه، باید از S (بزرگ) استفاده کنید.

توضیحات کامل در مورد این Flag ها رو می تونید در این آدرس (http://msdn.microsoft.com/en-us/library/hf4y5e3w%28v=VS.100%29.aspx) بخونید.
موفق باشید.

Salar Ashgi
یک شنبه 18 مهر 1389, 10:05 صبح
میتونید از رشته ها هم استفاده کنید که کار رو بسیار راحتتر میکنه :




#include <iostream>
#include <conio>
#include <string>
using namespace std;
int main(){
string a[] = {"salar","ali","reza"};
for(int i=0;i<3;i++)
cout<<a[i]<<" ";
cout<<endl;
getch();
}