strings, arrays, and pointers cs-2303, c-term 20101 strings, arrays, and pointers cs-2303 system...

37
Strings, Arrays, and Pointers CS-2303, C-Term 20 10 1 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)

Post on 19-Dec-2015

229 views

Category:

Documents


8 download

TRANSCRIPT

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 1

Strings, Arrays, and Pointers

CS-2303System Programming Concepts

(Slides include materials from The C Programming Language, 2nd edition, by Kernighan and Ritchie and from C: How to Program, 5th and 6th editions, by Deitel and Deitel)

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 6

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

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 7

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

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 8

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

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 9

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 <stdio.h>• 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 *

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 10

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 <stdio.h>• 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

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 12

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

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 13

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"

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 14

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'

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 15

Support for Strings in C

• Most string manipulation is done through functions in <string.h>

• 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

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 16

Support for Strings in C (continued)

• Examples (continued):–– int strcmp(char *s, char *t)

• lexically compares s and t, returns <0 if s < t, >0 ifs > 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

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 17

Character functions in C

• See <ctype.h>• 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)

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 18

String Conversion Functions in C

• See <stdlib.h>• 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)

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 19

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!

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 20

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

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 21

Static Data Allocation

0x00000000

0xFFFFFFFF

address space

program code(text)

static data

heap(dynamically allocated)

stack(dynamically allocated)

PC

SPThis is The Heap.

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 22

Allocating Memory in The Heap

• See <stdlib.h>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

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 23

Allocating Memory in The Heap

• See <stdlib.h>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

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 24

Allocating Memory in The Heap

• See <stdlib.h>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

()

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 25

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

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 26

Typical usage of malloc() and free()

char *getTextFromSomewhere(…);

int main(){char * txt;…;txt = getTextFromSomewhere(…);…;printf("The text returned is %s.", txt);free(txt);

}

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 27

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()

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 28

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

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 29

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

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 30

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!

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 31

Questions?

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 32

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!

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 33

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

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 34

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);

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 35

Questions?

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 36

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)

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 37

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

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 38

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

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 39

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 xSizeConvert argument #2 to int for ySizeConvert argument #3 to int for gens

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 40

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

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 41

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!

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

Strings, Arrays, and Pointers

CS-2303, C-Term 2010 42

Questions?