Presentation is loading. Please wait.

Presentation is loading. Please wait.

Strings, Arrays, and Pointers CS-2303, C-Term 20101 Strings, Arrays, and Pointers CS-2303 System Programming Concepts (Slides include materials from The.

Similar presentations


Presentation on theme: "Strings, Arrays, and Pointers CS-2303, C-Term 20101 Strings, Arrays, and Pointers CS-2303 System Programming Concepts (Slides include materials from The."— Presentation transcript:

1 Strings, Arrays, and Pointers CS-2303, C-Term 20101 Strings, Arrays, and Pointers CS-2303 System Programming Concepts (Slides include materials from The C Programming Language, 2 nd edition, by Kernighan and Ritchie and from C: How to Program, 5 th and 6 th editions, by Deitel and Deitel)

2 Strings, Arrays, and Pointers CS-2303, C-Term 20102 Reading Assignment Kernighan & Ritchie, Chapter 5 –All the way through! Study §5.5 in detail — pages 104-107 –Character pointer and functions –You will use this all the time! Study §5.10 — pages 114-118 –Command line arguments –You will use this a lot!

3 Strings, Arrays, and Pointers CS-2303, C-Term 20103 Review Array – a set of elements all of the same type stored contiguously in memory – e.g., –int A[25]; // 25 integers –struct Str B[15]; /* 15 objects of type struct Str */ –double C[]; /* indeterminate # of doubles */ Pointer – a variable whose value is the location of some other object –float *p; // pointer to a float

4 Strings, Arrays, and Pointers CS-2303, C-Term 20104 Review (continued) int A[25]; // 25 integers Type of A[i] is int (for all i ). Type of A is int * I.e., pointer to int

5 Strings, Arrays, and Pointers CS-2303, C-Term 20105 Review (continued) ' & ' operator generates a pointer to its operand – e.g., –int n; –Type of &n is int * Unary ' * ' operator dereferences a pointer – i.e., accesses the thing pointed to – e.g., –int *p; –Type of *p is int

6 Strings, Arrays, and Pointers CS-2303, C-Term 20106 Summary Arrays and pointers are closely related Let int A[25]; int *p; int i, j; Let p = A; Then p points to A[0] p + i points to A[i] &A[j] == p+j *(p+j) is the same as A[j] Note: Comparison of pointers is legal, but only meaningful in the same array

7 Strings, Arrays, and Pointers CS-2303, C-Term 20107 Summary (continued) If void f(int A[], int arraySize); Then f(&B[i], bSize-i) calls f with subarray of B as argument Starting at element i, continuing for bSize-i elements

8 Strings, Arrays, and Pointers CS-2303, C-Term 20108 Review (concluded) void f(int A[], int arraySize); and void f(int *A, int arraySize); are identical! Most C programmers use pointer notation rather than array notation In these kinds of situations

9 Strings, Arrays, and Pointers CS-2303, C-Term 20109 Additional Notes A pointer is not an integer … Not necessarily the same size May not be assigned to each other … except for value of zero! Called NULL in C; defined in Means “pointer to nowhere” void * is a pointer to no type at all May be assigned to any pointer type Any pointer type may be assigned to void *

10 Strings, Arrays, and Pointers CS-2303, C-Term 201010 Additional Notes A pointer is not an integer … Not necessarily the same size May not be assigned to each other … except for value of zero! Called NULL in C; defined in Means “pointer to nowhere” void * is a pointer to no type at all May be assigned to any pointer type Any pointer type may be assigned to void * Defeats type-checking in the compiler A easy way to get into big trouble Absolutely necessary in most large C programs

11 Strings, Arrays, and Pointers CS-2303, C-Term 201011 Questions?

12 Strings, Arrays, and Pointers CS-2303, C-Term 201012 Characters in C char is a one-byte data type capable of holding a character Treated as an arithmetic integer type (Usually) unsigned May be used in arithmetic expressions Add, subtract, multiply, divide, etc. Character constants 'a', 'b', 'c', … 'z', '0', '1', … '9', '+', '-', '=', '!', '~', etc, '\n', '\t', '\0', etc. A-Z, a-z, 0-9 are in order, so that arithmetic can be done C99 & C++ introduce a new data type called wchar for international text

13 Strings, Arrays, and Pointers CS-2303, C-Term 201013 Strings in C Definition:– A string is a character array ending in '\0' — i.e., –char s[256]; –char t[] = "This is an initialized string!"; –char *u = "This is another string!"; String constants are in double quotes May contain any characters Including \" and \' — see p. 38, 193 of K&R String constants may not span lines However, they may be concatenated — e.g., "Hello, " "World!\n" is the same as "Hello, World!\n"

14 Strings, Arrays, and Pointers CS-2303, C-Term 201014 Strings in C (continued) Let –char *u = "This is another string!"; Then –u[0] == 'T' u[1] == 'h' u[2] == 'i' … u[21] == 'g' u[22] == '!' u[23] == '\0'

15 Strings, Arrays, and Pointers CS-2303, C-Term 201015 Support for Strings in C Most string manipulation is done through functions in String functions depend upon final '\0' So you don’t have to count the characters! Examples:– –int strlen(char *s) – returns length of string Excluding final '\0' –char* strcpy(char *s, char *ct) – Copies string ct to string s, return s s must be big enough to hold contents of ct ct may be smaller than s –See K&R pp. 105-106 for various implementations

16 Strings, Arrays, and Pointers CS-2303, C-Term 201016 Support for Strings in C (continued) Examples (continued) :– –int strcmp(char *s, char *t) lexically compares s and t, returns 0 if s > t, zero if s and t are identical –D&D §8.6, K&R p. 106 –char* strcat(char *s, char *ct) Concatenates string ct to onto end of string s, returns s s must be big enough to hold contents of both strings! Other string functions –strchr(), strrchr(), strspn(), strcspn() strpbrk(), strstr(), strtok(), … –K&R pp. 249-250; D&D §8.6

17 Strings, Arrays, and Pointers CS-2303, C-Term 201017 Character functions in C See These return or false (0) or true (non-zero) int isdigit(int c)int isalpha(int c) int isalnum(int c)int isxdigit(int c) int islower(int c)int isupper(int c) int isspace(int c)int iscntrl(int c) int ispunct(int c)int isprint(int c) int isgraph(int c) These change case (if appropriate) int toupper(int c)int tolower(int c)

18 Strings, Arrays, and Pointers CS-2303, C-Term 201018 String Conversion Functions in C See D&D §8.4; K&R p. 251-252 double atof(const char *s) int atoi(const char *s) long atol(const char *s) double strtod(const char *s, char **endp) long strtol(const char *s, char **endp, int base) unsigned long strtoul(const char *s, char **endp, int base)

19 Strings, Arrays, and Pointers CS-2303, C-Term 201019 Dilemma Question:– –If strings are arrays of characters, … –and if arrays cannot be returned from functions, … –how can we manipulate variable length strings and pass them around our programs? Answer:– –Use storage allocated in The Heap!

20 Strings, Arrays, and Pointers CS-2303, C-Term 201020 Definition — The Heap A region of memory provided by most operating systems for allocating storage not in Last in, First out discipline I.e., not a stack Must be explicitly allocated and released May be accessed only with pointers Remember, an array is equivalent to a pointer Many hazards to the C programmer

21 Strings, Arrays, and Pointers CS-2303, C-Term 201021 Static Data Allocation 0x00000000 0xFFFFFFFF address space program code (text) static data heap (dynamically allocated) stack (dynamically allocated) PC SP This is The Heap.

22 Strings, Arrays, and Pointers CS-2303, C-Term 201022 Allocating Memory in The Heap See void *malloc(size_t size); void free(void *ptr); void *calloc(size_t nmemb, size_t size); void *realloc(void *ptr, size_t size); malloc() — allocates size bytes of memory from the heap and returns a pointer to it. NULL pointer if allocation fails for any reason free() — returns the chunk of memory pointed to by ptr Must have been allocated by malloc or calloc

23 Strings, Arrays, and Pointers CS-2303, C-Term 201023 Allocating Memory in The Heap See void *malloc(size_t size); void free(void *ptr); void *calloc(size_t nmemb, size_t size); void *realloc(void *ptr, size_t size); malloc() — allocates size bytes of memory from the heap and returns a pointer to it. NULL pointer if allocation fails for any reason free() — returns the chunk of memory pointed to by ptr Must have been allocated by malloc or calloc Segmentation fault and/or big- time error if bad pointer

24 Strings, Arrays, and Pointers CS-2303, C-Term 201024 Allocating Memory in The Heap See void *malloc(size_t size); void free(void *ptr); void *calloc(size_t nmemb, size_t size); void *realloc(void *ptr, size_t size); malloc() — allocates size bytes of memory from the heap and returns a pointer to it. NULL pointer if allocation fails for any reason free() — returns the chunk of memory pointed to by ptr Must have been allocated by malloc or calloc free() knows size of chunk allocated by malloc() or calloc()

25 Strings, Arrays, and Pointers CS-2303, C-Term 201025 Notes calloc() is just a variant of malloc() malloc() is analogous to new in C++ and Java new in C++ actually calls malloc() free() is analogous to delete in C++ delete in C++ actually calls free() Java does not have delete — uses garbage collection to recover memory no longer in use

26 Strings, Arrays, and Pointers CS-2303, C-Term 201026 Typical usage of malloc() and free() char *getTextFromSomewhere(…); int main(){ char * txt; …; txt = getTextFromSomewhere(…); …; printf("The text returned is %s.", txt); free(txt); }

27 Strings, Arrays, and Pointers CS-2303, C-Term 201027 Typical usage of malloc() and free() char * getTextFromSomewhere(…){ char *t;... t = malloc(stringLength);... return t; } int main(){ char * txt; …; txt = getTextFromSomewhere(…); …; printf("The text returned is %s.", txt); free(txt); } getTextFromSomewhere() creates a new string using malloc()

28 Strings, Arrays, and Pointers CS-2303, C-Term 201028 Typical usage of malloc() and free() char * getTextFromSomewhere(…){ char *t;... t = malloc(stringLength);... return t; } int main(){ char * txt; …; txt = getTextFromSomewhere(…); …; printf("The text returned is %s.", txt); free(txt); } Pointer to text is assigned to txt in calling function

29 Strings, Arrays, and Pointers CS-2303, C-Term 201029 Usage of malloc() and free() char *getText(…){ char *t;... t = malloc(stringLength);... return t; } int main(){ char * txt; …; txt = getText(…); …; printf("The text returned is %s.", txt); free(txt); } main() must remember to free the storage pointed to by txt

30 Strings, Arrays, and Pointers CS-2303, C-Term 201030 Definition – Memory Leak The steady loss of available memory due to forgetting to free() everything that was malloc ’ed. Bug-a-boo of most large C and C++ programs If you “forget” the value of a pointer to a piece of malloc ’ed memory, there is no way to find it again! Killing the program frees all memory!

31 Strings, Arrays, and Pointers CS-2303, C-Term 201031 Questions?

32 Strings, Arrays, and Pointers CS-2303, C-Term 201032 String Manipulation in C Almost all C programs that manipulate text do so with malloc ’ed and free ’d memory No limit on size of string in C Need to be aware of sizes of character arrays! Need to remember to free storage when it is no longer needed Before forgetting pointer to that storage!

33 Strings, Arrays, and Pointers CS-2303, C-Term 201033 Input-Output Functions printf(const char *format,...) Format string may contain %s – inserts a string argument (i.e., char * ) up to trailing '\0' scanf(const char *format,...) Format string may contain %s – scans a string into argument (i.e., char * ) up to next “white space” Adds '\0' Related functions fprintf(), fscanf() – to/from a file sprintf(), sscanf() – to/from a string

34 Strings, Arrays, and Pointers CS-2303, C-Term 201034 Example Hazard char word[20]; …; scanf("%s", word); scanf will continue to scan characters from input until a space, tab, new-line, or EOF is detected An unbounded amount of input May overflow allocated character array Probable corruption of data! scanf adds trailing '\0 ' Solution:– scanf("%19s", word);

35 Strings, Arrays, and Pointers CS-2303, C-Term 201035 Questions?

36 Strings, Arrays, and Pointers CS-2303, C-Term 201036 Command Line Arguments See §5.10 By convention, main takes two arguments:- int main(int argc, char *argv[]); –argc is number of arguments –argv[0] is string name of program itself –argv[i] is argument i in string form i.e., i < argc –argv[argc] is null pointer! Sometimes you will see (the equivalent) int main(int argc, char **argv); An array of pointers to char (i.e., of strings)

37 Strings, Arrays, and Pointers CS-2303, C-Term 201037 Example — PA #2 Instead of prompting user game parameters, simply take them from command line % life 100 50 1000 would play the Game of Life on a grid of 100  50 squares for 1000 generations. argv[0] – name of program argv[1] – first program argument

38 Strings, Arrays, and Pointers CS-2303, C-Term 201038 Example — PA #2 (continued) int main(int argc, char *argv[])){ int xSize, ySize, gens; char grid[][]; if (argc <= 1) { printf(“Input parameters:- "); scanf("%d%d%d", &xSize, &ySize, &gens); } else { xSize = atoi(argv[1]); ySize = atoi(argv[2]); gens = atoi(argv[3]); } grid = calloc(xSize*ySize, sizeof char); /* rest of program using grid[i][j] */ free(grid); return 0; }//main(argc, argv) grid :– an array of unknown size declared; no storage allocated

39 Strings, Arrays, and Pointers CS-2303, C-Term 201039 Example — PA #2 (continued) int main(int argc, char *argv[])){ int xSize, ySize, gens; char grid[][]; if (argc <= 1) { printf(“Input parameters:- "); scanf("%d%d%d", &xSize, &ySize, &gens); } else { xSize = atoi(argv[1]); ySize = atoi(argv[2]); gens = atoi(argv[3]); } grid = calloc(xSize*ySize, sizeof char); /* rest of program using grid[i][j] */ free(grid); return 0; }//main(argc, argv) Convert argument #1 to int for xSize Convert argument #2 to int for ySize Convert argument #3 to int for gens

40 Strings, Arrays, and Pointers CS-2303, C-Term 201040 Example — PA #2 (continued) int main(int argc, char *argv[])){ int xSize, ySize, gens; char grid[][]; if (argc <= 1) { printf(“Input parameters:- "); scanf("%d%d%d", &xSize, &ySize, &gens); } else { xSize = atoi(argv[1]); ySize = atoi(argv[2]); gens = atoi(argv[3]); } grid = calloc(xSize*ySize, sizeof char); /* rest of program using grid[i][j] */ free(grid); return 0; }//main(argc, argv) grid :– allocate array

41 Strings, Arrays, and Pointers CS-2303, C-Term 201041 Example — PA #2 (continued) int main(int argc, char *argv[])){ int xSize, ySize, gens; char grid[][]; if (argc <= 1) { printf(“Input parameters:- "); scanf("%d%d%d", &xSize, &ySize, &gens); } else { xSize = atoi(argv[1]); ySize = atoi(argv[2]); gens = atoi(argv[3]); } grid = calloc(xSize*ySize, sizeof char); /* rest of program using grid[i][j] */ free(grid); return 0; }//main(argc, argv) Be sure to free() the allocated array before exiting!

42 Strings, Arrays, and Pointers CS-2303, C-Term 201042 Questions?


Download ppt "Strings, Arrays, and Pointers CS-2303, C-Term 20101 Strings, Arrays, and Pointers CS-2303 System Programming Concepts (Slides include materials from The."

Similar presentations


Ads by Google