לא מצליח לקמפל - שפת C - עמוד 3 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

לא מצליח לקמפל - שפת C


itai2k

Recommended Posts

  • תגובות 47
  • נוצר
  • תגובה אחרונה




#include <stdio.h>


#include <stdlib.h>


#include <ctype.h>


#include <string.h>




int numberToLetter();






int main(int argc, char *argv[])
{


FILE *inputf, *outputf;
int i=0;


int numbers[100]={0};




if(argc > 3) /* more then 2 names */


{


fprintf(stderr,"Eror! You cant enter more then 2 names.\n Goodbye!\n");


exit(0);


}




if(argc==1) /* no names */


{


if(!(inputf=fopen("standardInput.txt","r")))


{


perror("Cannot open standardInput file\n");


exit(0);


}


if(!(outputf=fopen("standardOutput.txt","w")))


{


perror("Cannot open standardOutput file\n");


exit(0);


}


while(!feof(inputf)) /* put all the numbers from the input file to the arry */


{


fscanf(inputf,"%d",&numbers[i]);


i++;


}




}




if(argc==2) /* if one name */


{


if(!(inputf=fopen(*(argv+1),"r")))


{


perror("Cannot open input file\n");


exit(0);


}


if(!(outputf=fopen("standardOutput.txt","w")))


{


perror("Cannot open standardOutput file\n");


exit(0);


}


while(!feof(inputf)) /* put all the numbers from the input file to the arry */


{


fscanf(inputf,"%d",&numbers[i]);


i++;


}


}




if(argc==3) /* if two names */


{


if(!(inputf=fopen(*(argv+1),"r")))


{


perror("Cannot open input file file\n");


exit(0);


}


if(!(outputf=fopen(*(argv+2),"w")))


{


perror("Cannot open output file\n");


exit(0);


}


while(!feof(inputf)) /* put all the numbers from the input file to the arry */


{


fscanf(inputf,"%d",&numbers[i]);


i++;


}


}




numberToLetter(numbers,outputf,inputf);
fclose(inputf);
fclose(outputf);
return 0;


}




int numberToLetter(int numbers[],FILE *out)


{


int i=0,ahadot,asarot,num=0;


char letters[100][20];


char firstWord[11][6]={"zero","one","two","three","four","five","six","seven","eight","nine","ten"};


char tenPlus[10][10]={"Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","seventeen","eighteen","nineteen"};


char secondWord[10][8]={"Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety"};




while(!numbers[i])


{


if(numbers[i]>0 && numbers[i]<11) /* if number between 0-10 */


{


num=numbers[i];


strcpy(letters[i],firstWord[num]);


}




if(numbers[i]>10)


{


num=numbers[i];


ahadot=num%10;


asarot=num/10;


if(ahadot==0)


strcpy(letters[i],tenPlus[asarot-1]);


else


scanf(letters[i],"%s" "%s",secondWord[asarot-1],firstWord[ahadot-1]);


}




i++;


}


i=0;


while(letters[i]!=NULL)


{


fprintf(out,"%s",letters[i]);


i++;


}
return 0;
}

זה הקוד הסופי (אחרי השינוי של ה argc), גם הוא מתקמפל. ועכשיו הוא אומר לי segmentation fault .

איפה לדעתך הבעיה? תודה שוב על הכל

קישור לתוכן
שתף באתרים אחרים

segmentation fault אומר שניסית לגשת לזכרון לא חוקי (כלומר יש לך מצביע לא תקני שאתה מנסה להשתמש בו, או שאתה חורג מגבולות של מערך). אני יכול להמליץ לך על אחד משלושה דברים:

1. להשתמש ב-valgrind, כלי שהמטרה שלו היא למצוא שגיאות כאלה בדיוק.

2. להשתמש בדיבאגר (כמו gdb, או דיבאגר מובנה בסביבת כמו eclipse) כדי לנסות לאתר את הבעיה.

3. להדפיס הדפסות עזר לאורך הקוד שלך ואז תראה איפה בדיוק הקריסה.

נ.ב. למה אתה עושה (1+argv)* במקום פשוט [1]argv?

קישור לתוכן
שתף באתרים אחרים

הקומפיילר של הלינוקס לא, אבל של הויזואל סטודיו כן. תיקנתי אבל עדיין עושה

segmentation fault

שמתי לב שזה רשם בפלט דברים בג'יבריש וכל מני דברים לא ברורים אולי זה קשור?

קישור לתוכן
שתף באתרים אחרים

ודאי שזה קשור. הדפסות ג'יבריש קורות (בין השאר) כשאתה מנסה לגשת לזכרון לא תקני. הדבר האחר שיכול לקרות במצב כזה (ואכן קרה) הוא segmentation fault.

למה שלא תכתוב ותריץ הכל ב-VS ורק אחרי שהתכנית עובדת תעביר אותה ללינוקס? זה יעשה לך את החיים הרבה יותר קלים.

קישור לתוכן
שתף באתרים אחרים

ב-VS, כברירת מחדל, הוא מריץ את התוכנה מהתיקייה שבה יושב ה-exe, שהיא לא התיקייה של הפרוייקט שלך, אלא תיקייה בשם /bin/Debug (או משהו בסגנון) שיושבת תחת התיקייה של הפרוייקט. אחרי שאתה מקמפל, חפש איפה יושב ה-exe ושים שם את הקובץ שלך.

קישור לתוכן
שתף באתרים אחרים

טוב שניתי את הקוד...

זה ככה:

אם המשתמש לא רשום כלום (רק מפעיל את הקובץ) זה נותן לו אופציה להכניס מספרים ואז הוא מדפיס את המספרים במילים כרגיל (printf)

אם הוא רושם שם אחד - הקובץ הזה יהיה קלט של מספרים וידפיס אותם רגיל (printf)

אם הוא רושם שני שמות הקובץ הראשון הוא קלט והקובץ השני הוא פלט.

זה הקוד:





#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>


int numberToLetter(int numbers[],FILE *out);
int numberToLetters(int numbers[]);


int main(int argc, char *argv[])
{


FILE *inputf, *outputf;
int i=0,num=0;
char line[100]={0};
char *temp;
int numbers[100]={0};




if(argc > 3) /* more then 2 names */


{


fprintf(stderr,"Eror! You cant enter more then 2 names.\n Goodbye!\n");


exit(0);


}




if(argc==1) /* no names */


{
printf("please enter numbers between 0-99:\n");
gets(line);
temp = strtok(line," ");
while(temp!=NULL)
{
temp = strtok(line," ");
num=atoi(temp);
numbers[i]=num;
i++;
}
numberToLetters(numbers);
}




if(argc==2) /* if one name */


{


if(!(inputf=fopen(argv[1],"r")))


{


perror("Cannot open input file\n");


exit(0);


}




while(!feof(inputf)) /* put all the numbers from the input file to the arry */


{


fscanf(inputf,"%d",&numbers[i]);


i++;


}
numberToLetters(numbers);


}




if(argc==3) /* if two names */


{


if(!(inputf=fopen(argv[1],"r")))


{


perror("Cannot open input file file\n");


exit(0);


}


if(!(outputf=fopen(argv[2],"w")))


{


perror("Cannot open output file\n");


exit(0);


}


while(!feof(inputf)) /* put all the numbers from the input file to the arry */


{


fscanf(inputf,"%d",&numbers[i]);


i++;


}
numberToLetter(numbers,outputf);
fclose(inputf);
fclose(outputf);

}


return 0;
}




int numberToLetter(int numbers[],FILE *out)


{


int i=0,ahadot,asarot,num=0;


char letters[100][20];


char firstWord[11][6]={"zero","one","two","three","four","five","six","seven","eight","nine","ten"};


char tenPlus[10][10]={"Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","seventeen","eighteen","nineteen"};


char secondWord[10][8]={"Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety"};


char word;




while(!numbers[i])


{


if(numbers[i]>0 && numbers[i]<11) /* if number between 0-10 */


{


num=numbers[i];


strcpy(letters[i],firstWord[num]);


}




if(numbers[i]>10)


{


num=numbers[i];


ahadot=num%10;


asarot=num/10;


if(ahadot==0)


strcpy(letters[i],tenPlus[asarot-1]);


else


scanf(letters[i],"%s" "%s",secondWord[asarot-1],firstWord[ahadot-1]);


}




i++;


}


i=0;


while(letters[i]!=NULL)


{


fprintf(out,"%s",letters[i]);


i++;


}
return 0;
}


int numberToLetters(int numbers[])
{
int i=0,ahadot,asarot,num=0;
char word;
char letters[100][20];
char firstWord[11][6]={"zero","one","two","three","four","five","six","seven","eight","nine","ten"};
char tenPlus[10][10]={"Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","seventeen","eighteen","nineteen"};
char secondWord[10][8]={"Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety"};




while(!numbers[i])


{


if(numbers[i]>0 && numbers[i]<11) /* if number between 0-10 */


{


num=numbers[i];
strcpy(letters[i],firstWord[num]);


}




if(numbers[i]>10)


{


num=numbers[i];


ahadot=num%10;


asarot=num/10;


if(ahadot==0)


strcpy(letters[i],tenPlus[asarot-1]);


else


scanf(letters[i],"%s" "%s",secondWord[asarot-1],firstWord[ahadot-1]);


}




i++;


}


i=0;


while(letters[i]!=NULL)


{


scanf(letters[i],"%s",&word);
printf("%s",word);


i++;


}
return 0;


}

הקובץ מתקמפל ב VS, עדיין אני מנסה את האפשרות הראשונה שהמתמש מכניס מספרים וזה מדפיס לו כרגיל. אך שאני מכניס מספר הוא פשוט לא עושה כלום... הוא יורד שורה וזהו...

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.


×
  • צור חדש...