מעבר לתוכן


קבלת מחרוזת מהמשתמש ב-C


  • Please log in to reply
12 replies to this topic

#1 אורח - השואל

אורח - השואל
  • אורחים

פורסם 10/05/2009 - 17:50

אהלן!

תגידו איך אני יכול לקבל מחרוזת מהמשתמש ב-C שאין לי מושג מה יהיה האורך שלה?
חשבתי לאתחל פווינטר מסוג CHARים בן תו אחד, ולקלוט מהמשתמש תו תו. בין לבין להגדיל את אורך המערך ע"י ()realloc.
כאשר התו הבא הוא אנטר לסיים את הלולאה שקולטת תו ולהגדיל את הפוינטר.

אבל אין לי שמץ איך לרשום את זה בקוד..

אפשרי לקבל קצת עזרה ?

#2 FoodGood

FoodGood

    משתמש טרי

  • רשומים
  • 13 הודעות:

פורסם 10/05/2009 - 22:19

תנסה את הפונקציה
gets()


#3 geohot

geohot

    ברונזה

  • רשומים+
  • 962 הודעות:

פורסם 10/05/2009 - 22:27

gets() יכולה לגלוש לך אם המשתמש הכניס מחרוזת ארוכה מידי
תן מערך של צ'ארים עם מספיק מקום ותכניס אליו עם scanf
If at first you don't succeed... so much for skydiving."
"Rumors travel halfway around the world while the truth is putting on its shoes"
"The difference between Truth and Fiction - Fiction has to make sense."

#4 Webworm

Webworm

    The Truth Shall Set You Free

  • מנהלי פורום
  • 2340 הודעות:

פורסם 11/05/2009 - 00:30

gets() יכולה לגלוש לך אם המשתמש הכניס מחרוזת ארוכה מידי
תן מערך של צ'ארים עם מספיק מקום ותכניס אליו עם scanf


זה לא מה שהוא ביקש . לא משנה כמה ארוך תיתן את המערך של צארים זה עדיין ייכול לגלוש לך .

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

לא חושב שמישהו ישב לך ויכתוב את הקוד . תתחיל לתכנת ואם תקלע לבעיות תחזור לפה .
בינוני זה הכי,אחי

נגע הסיינטולוגיה הגיע לבאר שבע,לחצו פה כדי ללמוד על הכת המסוכנת הזאת


האמת הלא מצחיקה על סיינטולוגיה,לחצו פה לסרטון (לא לבעלי לב חלש)


סטודנטים בוחרים:סוגיות עקרוניות בארץ ובעולם (בבניה...)

חברים מספרים על webworm

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

הערה: החבר הוא סיינטולוג

Everything you read in the newspaper is absolutely true except for the rare story of which you happen to have first-hand knowlege

Erwin Knoll


#5 Tziff5

Tziff5

    אני לא גזען - אני שונא את כולם באופן שווה

  • רשומים+
  • 5644 הודעות:

פורסם 11/05/2009 - 01:13


 typedef char Element;

 #define INITIAL_SIZE 10

 

 typedef struct

 {

	 unsigned int size, capacity;

	 Element* elements;

 } Vector;

 

 Vector* build()

 {

	 Vector* result = (Vector*)malloc(sizeof(Vector));

	 result->elements = (Element*)malloc(sizeof(Element) * INITIAL_SIZE);

	 result->size = 0;

	 result->capacity = INITIAL_SIZE;

	 return result;

 }

 

 void put(Vector* vector, Element e)

 {

	 if (vector->size == vector->capacity)

	 {

		 vector->capacity *= 2;

		 vector->elements = (Element*)realloc(vector->elements, sizeof(Element) * vector->capacity);

	 }

	 vector->elements[vector->size] = e;

	 vector->size++;

 }

 

 Element* get(Vector* vector)

 {

	 return vector->elements;

 }

its better to be drunk than to be smart.
666 is evil, but 25.806975801127880315188420605149 is the root of all evil.
it's so simple to be wise. just think of something stupid to say, and dont say it!
women - can't live with them, can't successfully refute their hypothesis.
z


#6 OBA

OBA

    the one horseman of the apocralypse

  • רשומים+
  • 1504 הודעות:

פורסם 12/05/2009 - 23:48

כתבתי משהו כזה בתחילת שנה ב'.... אנ יחפש את זה ונראה אם אני ימצא משהו.
הנה הקוד של הטיפול במחרוזות באופן מאובטח. מדובר על הדבר הכי מלוכלך ולא יעיל שכתבתי בחיים שלי + העובדה שזה עלול לזרוק בעיות משונות.
[codebox]#ifndef stdlib.h
#include <stdlib.h>
#endif ;
#ifndef string.h
#include <string.h>
#endif ;
#include "string_operations.h"

char* add_char_to_string(char* str ,char c ) {
char * res = (char*)malloc(strlen(str)+2);
char * ptr = res ;
while(*(str) != '\0') {
*ptr++=*str++ ;
} // while
*ptr = c ;
ptr++ ;
*ptr = '\0' ;
return res ;
} // add_char_to_string

char* get_line_from_input() {
char * str = (char *)malloc(2) ;
char * ptr ;
*str = '\0' ;
char c ;
while ( (c=getchar()) != '\n') {
ptr = add_char_to_string(str ,c) ;
free(str) ;
str=ptr ;
} // while
return str ;
} // get_line_from_input

char* get_word_from_string(char* str) {
char * ptr = str ;
char * res = (char*)malloc(2) ;
*res = '\0' ;
char c ;
char* pntr = res ;
while(*ptr != '\0' && *ptr != ' ' && *ptr != '\t' && *ptr != '\n') {
c = *ptr ;
pntr = add_char_to_string(res , c) ;
free(res) ;
res = pntr ;
ptr++ ;
} // while
return res ;
} // get_word_from_string

char * get_n_word_from_string(char* str, int n) {
int i ;
while (*str == ' ' || *str == '\t') str++ ;
for ( i=1 ; i<n ; i++) {
while (*str != ' ' && *str != '\n' && *str != '\0' && *str != '\t') str++ ;
while (*str == ' ' || *str == '\t') str++ ;
if (*str=='\n' || *str=='\0') return NULL ;
}//for
return get_word_from_string(str);
} // get_n_word_from_string

char* get_line_from_file( FILE* file_ptr) {
if (file_ptr == NULL) {
return NULL ; }
char * line = (char*)malloc(2) ;
char * pntr = line ;
*pntr = '\0' ;
char ch = fgetc( file_ptr ) ; // read the first char
if(ch == EOF) {
free(line) ;
return NULL ; }
while (ch != '\n' && ch != EOF) { // as long as the end of the file is not reached
pntr = add_char_to_string(line , ch) ;
free (line) ;
line = pntr ;
ch = fgetc( file_ptr ) ; // read the next char.
} // while
return line ;
}//get_line_from_file

char* string_reverse(char * str) {
char* ptr = (char*)malloc(strlen(str)+1) ;
char* res = ptr;
char* hlp = str+strlen(str)-1 ;
int i ;
for ( i=0 ; i<strlen(str) ; i++ ){
*ptr++=*hlp-- ;
}
*ptr = '\0' ;
return res ;
} //string_reverse

float* string_to_float( char * str) {
// printf(" the passed string is -> %s\n" ,str) ;
char* hlp_ptr = str ;
char* whole=NULL ;
char* partial=NULL ;
int plus_minus=1 ;
if (*hlp_ptr == 45) { hlp_ptr++ ; }
int point = 0 ;// will count how any times the point char appears.
while(((*hlp_ptr < 58 && *hlp_ptr > 47) || *hlp_ptr == 46) && point<2 ) {
if (*hlp_ptr == 46) { whole=hlp_ptr-1 ;point++ ; partial=hlp_ptr+1 ;}
//printf( "%c" , *hlp) ;
hlp_ptr++ ;
}
if(point==2 || *hlp_ptr != '\0') return NULL ;
//printf( "\n") ;
hlp_ptr=str ;
if (*hlp_ptr == 45) { hlp_ptr++ ; plus_minus=-1;}
if (*hlp_ptr == 46) { partial=hlp_ptr+1; whole=NULL; }
if (point==0) { whole=str+strlen(str)-1 ; }
// if (point==1) { printf("a point was detected ->%s <- %s\n",o,t) ;} else {printf("no point was detected ->%s <- %s\n",o,t) ;}
int sum=0 ;
if (whole!=NULL) {
int i=1;
while(whole != hlp_ptr-1) {
sum += (*whole-48)*i ;
whole--;
i *= 10 ;
} //while /**/
} //if
float fsum = 0 ;
if (partial!=NULL) {
float part = 0.1 ;
while(*partial != '\0') {
fsum += (*partial-48)*part ;
partial++;
part = (float)(part / 10) ;
//printf("the partial denomerator is -> %.10f\n" , part) ;
}//while
} //if
float f = sum ;
// printf( "the whole part is -> %.5f\n" , f) ;
// printf( "the partial part is -> %.5f\n" , fsum) ;
float* res = (float*)malloc(sizeof(float));
*res =plus_minus*(fsum+f) ;
//printf( "the returned value is -> %f\n" , *res) ;
return res ;
} //string_to_float[/codebox]

Eric looked down at the broad steps they were climbing. They were something of a novelty; each one was built out of large stone letters. The one he was just stepping on to, for example, read: I Meant It For The Best.
The next one was: I Thought You’d Like It.
He was standing on: For the Sake of the Children.
“Weird, isn’t it?” he said. “Why do it like this?”
“I think they’re meant to be good intentions,” said Rincewind.

תמונה מצורפתתמונה מצורפת

#7 אורח - נוחי

אורח - נוחי
  • אורחים

פורסם 13/05/2009 - 15:51

כתבתי משהו כזה בתחילת שנה ב'.... אנ יחפש את זה ונראה אם אני ימצא משהו.
הנה הקוד של הטיפול במחרוזות באופן מאובטח. מדובר על הדבר הכי מלוכלך ולא יעיל שכתבתי בחיים שלי + העובדה שזה עלול לזרוק בעיות משונות.

#ifndef stdlib.h
#include <stdlib.h>
#endif ;
#ifndef string.h
#include <string.h>
#endif ;
#include "string_operations.h"

char* add_char_to_string(char* str ,char c ) {
	char * res = (char*)malloc(strlen(str)+2);
	char * ptr = res ;
	while(*(str) != '\0') {
				*ptr++=*str++ ;
		} // while
	*ptr = c   ;
	ptr++ ;
	*ptr = '\0' ;
	return res ;
	} // add_char_to_string
	
char* get_line_from_input() {
	char * str = (char *)malloc(2) ;
	char * ptr ;
	*str = '\0' ;
	char c ;
	while ( (c=getchar()) != '\n') {
		ptr = add_char_to_string(str ,c) ;
		free(str) ;
		str=ptr ;
		} // while
	return str ;
	} // get_line_from_input
	
char* get_word_from_string(char* str) {
	char * ptr = str ;
	char * res = (char*)malloc(2) ;
	*res = '\0' ;
	char c ;
	char* pntr = res ;
	while(*ptr != '\0' && *ptr != ' ' && *ptr != '\t' && *ptr != '\n') { 
		c = *ptr ;
		pntr = add_char_to_string(res , c) ;
		free(res) ;
		res = pntr ;
		ptr++ ;
		} // while
	return res ;
} // get_word_from_string

char * get_n_word_from_string(char* str, int n) {
	int i ;
	while (*str == ' ' || *str == '\t') str++ ;
	for ( i=1 ; i<n ; i++) {
		while (*str != ' ' && *str != '\n' && *str != '\0' && *str != '\t') str++ ;
		while (*str == ' ' || *str == '\t') str++ ;
		if (*str=='\n' || *str=='\0') return NULL ;
	}//for
	return get_word_from_string(str);
} // get_n_word_from_string

char* get_line_from_file( FILE* file_ptr) {
	if (file_ptr == NULL) {
	return NULL ; }
	char * line = (char*)malloc(2) ;
	char * pntr = line ;
	*pntr = '\0' ;
	char ch  = fgetc( file_ptr ) ; // read the first char
	if(ch == EOF) {
		free(line) ; 
		return NULL ; }
	while (ch != '\n' && ch != EOF) { // as long as the end of the file is not reached
		pntr = add_char_to_string(line , ch) ;
		free (line) ;
		line = pntr ;
		ch = fgetc( file_ptr ) ; // read the next char.
	} // while
	return line ;
}//get_line_from_file

	char* string_reverse(char * str) {
		char* ptr = (char*)malloc(strlen(str)+1) ;
		char* res = ptr;
		char* hlp = str+strlen(str)-1 ;
		int i ;
		for ( i=0 ; i<strlen(str) ; i++ ){
			*ptr++=*hlp-- ;
			}	
		*ptr = '\0' ;
	return res ;
	} //string_reverse
	
	float* string_to_float( char * str) {
//	printf(" the passed string is -> %s\n" ,str) ;
	char* hlp_ptr = str ; 
	char* whole=NULL ;
	char* partial=NULL ;
	int plus_minus=1 ;
	if (*hlp_ptr == 45) { hlp_ptr++ ; }
	int point = 0 ;// will count how any times the point char appears.
	while(((*hlp_ptr < 58 && *hlp_ptr > 47) || *hlp_ptr == 46) && point<2  ) {
		if (*hlp_ptr == 46) { whole=hlp_ptr-1 ;point++ ; partial=hlp_ptr+1 ;}
		//printf( "%c" , *hlp) ;
		hlp_ptr++ ;
		}
	if(point==2 || *hlp_ptr != '\0') return NULL ;
	//printf( "\n") ;
	hlp_ptr=str ;
	if (*hlp_ptr == 45) { hlp_ptr++ ; plus_minus=-1;}
	if (*hlp_ptr == 46) { partial=hlp_ptr+1; whole=NULL; }
	if (point==0) { whole=str+strlen(str)-1 ; }
//	if (point==1) { printf("a point was detected ->%s <- %s\n",o,t) ;} else {printf("no point was detected ->%s <- %s\n",o,t) ;}
	int sum=0 ; 
	if (whole!=NULL) { 
	int i=1;
	while(whole != hlp_ptr-1) {
		sum += (*whole-48)*i ;
		whole--;
		i *= 10 ;
	} //while /**/
	} //if
	float fsum = 0 ;
	if (partial!=NULL) { 
		float part = 0.1 ;
		while(*partial != '\0') {
			fsum += (*partial-48)*part ;
			partial++;
			part = (float)(part / 10) ;
			//printf("the partial denomerator is -> %.10f\n" , part) ;
		}//while 
	} //if
	float f = sum ;
//	printf( "the whole part is -> %.5f\n" , f) ;
//	printf( "the partial part is -> %.5f\n" , fsum) ;	float* res = (float*)malloc(sizeof(float));	*res =plus_minus*(fsum+f) ;	//printf( "the returned value is -> %f\n" , *res) ;	return res ;	} //string_to_float

כתוב גרוע מאוד... :no:

#8 OBA

OBA

    the one horseman of the apocralypse

  • רשומים+
  • 1504 הודעות:

פורסם 13/05/2009 - 17:16

כתוב גרוע מאוד... :no:


אבל כשאתה לומד, מותר לכתוב דברים כאלה. שוב, מדובר כאן על הקוד הכי לא יעיל שכתבתי אי פעם.

Eric looked down at the broad steps they were climbing. They were something of a novelty; each one was built out of large stone letters. The one he was just stepping on to, for example, read: I Meant It For The Best.
The next one was: I Thought You’d Like It.
He was standing on: For the Sake of the Children.
“Weird, isn’t it?” he said. “Why do it like this?”
“I think they’re meant to be good intentions,” said Rincewind.

תמונה מצורפתתמונה מצורפת

#9 hdan

hdan

    חבר מן המניין במועדון הזהב

  • גנרלים בדימוס
  • 10911 הודעות:

פורסם 13/05/2009 - 21:02

אבל כשאתה לומד, מותר לכתוב דברים כאלה. שוב, מדובר כאן על הקוד הכי לא יעיל שכתבתי אי פעם.

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

בקשר לעניין השני, אני ממליץ מאוד לעולם לא להשתמש ב-gets או scanf לשם קליטת מחרוזות - אלה פונקציות רעות כי הן כותבות ל-buffer ולא מקבלות את הגודל שלו כפרמטר, מה שאומר שאם הקלט גדול מידי אז אין אפשרות להימנע מ-Buffer Overflow.
ההמלצה שלי היא להשתמש ב-fgets ולהכניס stdin בפרמטר הראשון.

מתכנת? יש מי שדואג לך! פורום תכנות.

 

 


המחשב עושה בעיות? פנו אליי ואתקן! פרטים בה"פ | מעביר שיעורים פרטיים בתכנות במגוון שפות. פרטים גם כן בה"פ

עד גמר המלאי / בכפוף לתקנון / אין כפל מבצעים / טל"ח / המשתמש שומר לעצמו את הזכות להפסיק את המבצעים בכל עת וללא הודעה מוקדמת.


#10 OBA

OBA

    the one horseman of the apocralypse

  • רשומים+
  • 1504 הודעות:

פורסם 13/05/2009 - 21:40

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

בקשר לעניין השני, אני ממליץ מאוד לעולם לא להשתמש ב-gets או scanf לשם קליטת מחרוזות - אלה פונקציות רעות כי הן כותבות ל-buffer ולא מקבלות את הגודל שלו כפרמטר, מה שאומר שאם הקלט גדול מידי אז אין אפשרות להימנע מ-Buffer Overflow.
ההמלצה שלי היא להשתמש ב-fgets ולהכניס stdin בפרמטר הראשון.


הממממ. השפת "תכנות" (היא לא באמת) הראשונה שבאמת עבדתי איתה היא perl. תנסה עכשיו ללמוד לתכנת נכון מהתחלה...... אני מקולקל ומודע לזה.
הקוד c אשר כתוב למעלה הוא קוד שנכתב במטרה לבצע מספר מסוים של פעולות הכוללות קליטת מחרוזת ללא אפשרות של buffer overflow, וביצוע parse על המחרוזת המתקבלת.
הקוד מבצע את המוטל עליו באופן שמגן לגמרי מפני תקלות, הסיבה העיקרית שכתבתי את הקוד עזר הזה היא בגלל שלא סמכתי על המתרגל שנתן את העבודה, שיכניס קלט חוקי לתוכנית (עניין הגבלת הbuffer).

Eric looked down at the broad steps they were climbing. They were something of a novelty; each one was built out of large stone letters. The one he was just stepping on to, for example, read: I Meant It For The Best.
The next one was: I Thought You’d Like It.
He was standing on: For the Sake of the Children.
“Weird, isn’t it?” he said. “Why do it like this?”
“I think they’re meant to be good intentions,” said Rincewind.

תמונה מצורפתתמונה מצורפת

#11 אורח - נוחי הנוכל

אורח - נוחי הנוכל
  • אורחים

פורסם 13/05/2009 - 22:19

אבל כשאתה לומד, מותר לכתוב דברים כאלה. שוב, מדובר כאן על הקוד הכי לא יעיל שכתבתי אי פעם.


אה, אני דווקא התכוונתי לזה:

כתבתי משהו כזה בתחילת שנה ב'.... אנ יחפש את זה ונראה אם אני ימצא משהו.
הנה הקוד של הטיפול במחרוזות באופן מאובטח. מדובר על הדבר הכי מלוכלך ולא יעיל שכתבתי בחיים שלי + העובדה שזה עלול לזרוק בעיות משונות.



#12 אורח - מימון

אורח - מימון
  • אורחים

פורסם 13/02/2015 - 12:56

איך אני קולט מחרוזית למערך…??!?

#13 Imdiaz

Imdiaz

    דברים ל"ב ט"ו

  • מנהלים ראשיים
  • 13508 הודעות:

פורסם 16/02/2015 - 21:44

איך אני קולט מחרוזית למערך…??!?

 

מדיח את היו"ר וממתין שהיא תעבור שתיים-שלוש מפלגות!









אין מנוחה לרשעים
וצדק לטפשים
ואני בעוונותיי
טיפש מכדי להיות צדיק
ורשע מכדי לנהוג בחכמה





0 משתמשים קוראים נושא זה

0 משתמשים, 0 אורחים, 0 משתמשים אנונימיים