PDA

View Full Version : مبتدی: مشكل باscanf!!!!!!!



بانوی ایران
جمعه 02 بهمن 1388, 18:34 عصر
دوستان من دچار يه مشكلي شدم
چند روزه هر كدي مينويسم توي scsnfكردن ارور ميده:متعجب:
برنامه هاي قبليم مشكل نداره
هر برنامه جديدي مينويسم مشكل بهم ميزنه
يه نگاه بندازيد به اين دو تا كد ببينيد مشكل از كامپيوترمه يا اين كد مشكل داره!!!!!

#include <stdio.h>
#include <stdlib.h>
#include<conio.h>
void max(int *array,int size,int max1,int max2)
{
int i,temp;
max1=array[0];
max2=array[1];
if (max2>max1)
{
temp=max1;
max2=max1;
max1=temp;
}
for (i=0;i<size;i++)
{
if(array[i]>max1)
max1=array[i];
else if (array[i]>max2)
max2=array[i];
}
}
int main(void)
{
int *list;
int max_num1,max_num2,n,i;
list=(int*)malloc(n*sizeof(int));
printf("enter the size\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("enter num[%d]", i);
scanf("%d",&list[i]);
}
max(list,n,max_num1,max_num2);
printf("%d%d", max_num1, max_num2);
getch();
return 0;
}


#include <stdio.h>
#include<stdlib.h>
#include<conio.h>
void g(FILE *f,char *f_path){
f=fopen (f_path,"r");
if (f_path==NULL)
{
printf("error!");
exit(EXIT_FAILURE);
}
}
int main(){
int n;
char s[200];
FILE *f_in;
printf("\nEnter Address:");
scanf("%s",s);
g(f_in,s);
fscanf(f_in, "%d", &n);
fclose(f_in);
printf("%d",n);
getch();

}

mortezamsp
جمعه 02 بهمن 1388, 18:47 عصر
تو دومی : scanf( "%s" ,&s )
اولی رو نمیدونم شاید مشکل از malloc باشه . (کامپایلر ندارم )

بانوی ایران
جمعه 02 بهمن 1388, 18:48 عصر
ولي من اين قسمت كد رو توي يه برنامه ديگه بدون &دارم مشكل ندازه
تغييرشم دادم
بازم ارور داد!!!!!!!:عصبانی++:

clover
جمعه 02 بهمن 1388, 22:56 عصر
برنامه اول:

1- در هنگام رسیدن به دستور زیر هنوز n را از ورودی نگرفته اید. بعد از گرفتن n می توانید از این دستور استفاده کنید:

list=(int*)malloc(n*sizeof(int));
2- پیشنهاد می شود از کلماتی مانند array که در آینده امکان دارد به عنوان کلمات کلیدی زبان مورد استفاده قرار گیرند استفاده نکنید.
3- پارامتر های max1 و max2 از تابع max باید به صورت ارجاع تعریف شوند:

void max(int *arr,int size,int &max1,int &max2)

برنامه اصلاح شده:

#include <stdio.h>
#include <stdlib.h>
#include<conio.h>
void max(int *arr,int size,int &max1,int &max2)
{
int i,temp;
max1=arr[0];
max2=arr[1];
if (max2>max1)
{
temp=max1;
max2=max1;
max1=temp;
}
for (i=0;i<size;i++)
{
if(arr[i]>max1)
max1=arr[i];
else if (arr[i]>max2)
max2=arr[i];
}
}
int main(void)
{
int *list;
int max_num1,max_num2,n,i;
printf("enter the size\n");
scanf("%d",&n);
list=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
{
printf("enter num[%d]", i);
scanf("%d",&list[i]);
}
max(list,n,max_num1,max_num2);
printf("%d%d", max_num1, max_num2);
getch();
return 0;
}

تو دومی : scanf( "%s" ,&s )
دوست عزیز mortezamsp ، دقت کنید که s یک آرایه هست و دستور ایشون صحیح هست، در ضمن اگر این آرایه به صورت پویا تعریف شده بود کد شما با خطا مواجه میشد، گرچه هر دو دستور نا امن هستند.

برنامه دوم:
1- باز هم همان ایراد قبلی، در تابع g ، پارامتر f باید با ارجاع فرستاده شود.

void g(FILE *&f,char *f_path)
2- در دستور if داخل تابع، شما باید بررسی کنید که f (اشاره گر به فایل) NULL نباشد. که اشتباها f_path را چک کرده اید.

if (f==NULL)
برنامه اصلاح شده:

#include <stdio.h>
#include<stdlib.h>
#include<conio.h>
void g(FILE *&f,char *f_path){
f=fopen (f_path,"r");
if (f==NULL)
{
printf("error!");
exit(EXIT_FAILURE);
}
}
int main(){
int n;
char s[200];
FILE *f_in;
printf("\nEnter Address:");
scanf("%s",s);
g(f_in,s);
fscanf(f_in, "%d", &n);
fclose(f_in);
printf("%d",n);
getch();

}
یادآوری می کنم که برنامه های فوق اشکالات زیادی دارند اما به هر حال در این سطح اجرا می شوند.

بانوی ایران
جمعه 02 بهمن 1388, 23:29 عصر
خيلي خيلي ممنون
چرا بايد با& بزارم؟
و اينكه چرا ميگيد مشكل دارند
بيشتر دومي رو ميخوام بدونم

clover
جمعه 02 بهمن 1388, 23:47 عصر
چرا باید با& بزارم؟
خب شما می خواهید متغیر هایی که در بیرون از تابع تعریف کرده اید را وارد تابع کنید و تغییر دهید، در واقع می خواهید نتیجه عملیات را در پارامتر های ارجاعی ذخیره کنید تا در بیرون از تابع قابل دسترسی باشند، اگر & نذارید که میشه ارسال با مقدار، یعنی شما در تابع متغیر های جدیدی تعریف کرده اید که فقط در خود تابع قابل دسترسی هستند (محلی هستند) و پس از انجام عملیات و پایان کار تابع از بین می روند.


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

بانوی ایران
شنبه 03 بهمن 1388, 00:10 صبح
اگر مشكلي نيست بهينه شده ي تابع دوم رو بهم بگيد
من ميخوام يه تابع داشته باشم كه يه فايل رو برام باز كنه و بتونم چند جا فراخواني كنم مشكل چيه و اگر اين تابع بده از چه تابعي بايد استفاده كنم
و دوم استفاده از scanfمنظورتون ادرس فايله؟
علت استفاده از اسكن اينه كه اين برنامه رو من ميخوام تحويل استادم بدم وميخوام خود كاربر بتونه فايل مورد نظر خودشو باز كنه مشكلش چيه؟(نحوه ادرس دهي؟)

clover
شنبه 03 بهمن 1388, 00:49 صبح
من میخوام یه تابع داشته باشم که یه فایل رو برام باز کن
البته ایجاد چنین تابعی بی معنی هست چون fopen دقیقا همین کار را انجام میده. در کد زیر شما می تونید عملیات گرفتن مسیر فایل را هم به داخل تابع ببرید تا ایجاد چنین تابعی توجیه داشته باشه. در اون صورت تابع به پارامتر احتیاجی نداره.

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

#include <stdio.h>
#include<stdlib.h>
#include<conio.h>

FILE *openFile(const char *filePath, const char *openType);
int closeFile(FILE *filePointer);

int main(){
int n;
char filePath[200];
FILE *f_in;

printf("\nEnter Address:");
scanf_s("%199s", filePath, 200);

f_in = openFile(filePath, "r");
if (f_in == 0)
{
printf("ERROR !");
exit(1);
}

fscanf_s(f_in, "%d", &n);
printf_s("%d",n);

closeFile(f_in);
getch();
return 0;
}

FILE *openFile(const char *filePath, const char *openType)
{
FILE *filePointer = 0;

if (openType == "r" || openType == "w")
filePointer = fopen(filePath, openType);

return filePointer;
}

int closeFile(FILE *filePointer)
{
if (filePointer != 0)
{
fclose(filePointer);
return 1;
}

return 0;
}

clover
شنبه 03 بهمن 1388, 01:10 صبح
و دوم استفاده از scanfمنظورتون ادرس فایله؟
منظورم خود تابع scanf هست که نا امن هست و به جای اون می تونید از scanf_s استفاده کنید، در ضمن برای گرفتن یک رشته با این تابع بهتر هست که طول تابع را هم مشخص کنید.
گفتم که برای برنامه شما زیاد (شاید هم اصلا) مهم نیست، فقط خواستم اشاره کرده باشم.