270 likes | 374 Views
Programming. Review: Functions, pointers and strings. num. str. m o s h e . 1 2 3. q. p. Pointers. int nums[] = {1, 2, 3}; char str[] = "moshe"; int* q = nums; char* p = str;. str. 1 2 3. (p+3). Pointers. int nums[] = {1, 2, 3}; char str[] = "moshe";
E N D
Programming Review: Functions, pointers and strings
num str m o s h e \0 1 2 3 q p Pointers int nums[] = {1, 2, 3}; char str[] = "moshe"; int* q = nums; char* p = str;
str 1 2 3 (p+3) Pointers int nums[] = {1, 2, 3}; char str[] = "moshe"; int* q = nums; char* p = str; m o s h e \0 (q+1)
1 2 3 Pointers p[0] *p p[i] *(p+i) p[1] p[4] q[0] q[1] q[2] m o s h e \0 q p
Pointers and Functions • If we want to change a variable inside a function, we must pass it a pointer to the variable (its address) • The function will “fill” this address with the right value • Example: Swap void swap(int *x, int *y){int temp = *x; *x = *y; *y = temp;}
Pointers and Functions Variables that are defined inside the function “die” when the function ends!!! char* func(){char str[LENGTH + 1]; ...return str;} str doesn’t exist outside the function’s body
int main() { int n = 3; multBy3(n); printf(“n=%d”,n); } void multBy3(int n) { int num = n; num *= 3; n = num;} 1.What is wrong here?
int main() { int n = 3; multBy3(&n); printf(“n=%d”,n); } void multBy3(int *n) { int num = n; num *= 3; n = num;} 2.What is wrong here?
int main() { int n = 3; multBy3(&n); printf(“n=%d”,n); } void multBy3(int *n) { int num = *n; num *= 3; n = num;} 3.What is wrong here?
int main() { int n = 3; multBy3(&n); printf(“n=%d”,n); } void multBy3(int *n) { int num = *n; num *= 3; n = #} 4.What is wrong here?
Define a variable in the main Pass its address to the function The function fills the address with a value The main can use it as a normal variable int main() { int num; } References
Define a variable in the main Pass its address to the function The function fills the address with a value The main can use it as a normal variable Int main() { int num; multBy3(&num); } References
Define a variable in the main Pass its address to the function The function fills the address with a value The main can use it as a normal variable Int main() { int num; multBy3(&num); } References void multBy3(int *n) { (*n) *=3; }
Define a variable in the main Pass its address to the function The function fills the address with a value The main can use it as a normal variable Int main() { int num; multBy3(&num); printf(“num=%d”,num); } References
Exercise with pointers and strings • Implement the following function: char* str_any(char *str1, char *str2); • Input – two strings str1, str2 • Output – pointer to the first occurrence in str1 of any of the characters contained in str2
Exercise (cont.) Write a program that accepts a string from the userand replaces all punctuation signs (,.;:!?) with spaces
Solution (str_any.c) char* str_any(char* str1, char* str2) { while (*str1 != '\0') { if (strchr(str2, *str1) != NULL) { return str1; } ++str1; } return NULL; }
Solution int main(void) { char* punc = ".,;:!?"; char s[MAX_LENGTH + 1]; char *p; printf("Please enter a line of text\n"); scanf("%100s", s); for (p = str_any(s, punc); p != NULL; p = str_any(p + 1, punc)) { *p = ' '; } printf("Resulting string is:\n%s\n", s); return 0; }
Command line arguments • Command line arguments are arguments for the main function • Recall that main is basically a function • It can receive arguments like other functions • The ‘calling function’ in this case is the operating system, or another program
‘main’ prototype int main(int argc, char* argv[]) • When we want main to accept command line arguments, we must define it like this • argc holds the number of arguments that were entered by the caller • argv is an array of pointers to char – an array of strings – holding the text values of the arguments • The first argument is always the program’s name
‘main’ prototype int main(int argc, char* argv[]) argc : 3 argv : progname\0 text\0 178\0
Example /* This program displays its command-line arguments */ #include <stdio.h> int main(int argc, char *argv[]) { int i; printf("The program's command line arguments are: \n"); for (i = 0; i < argc; ++i) { printf("%s\n", argv[i]);} return 0; }
Specifying the arguments • In Visual Studio:Project Settings Debug, in the ‘program arguments’ field
Specifying the arguments • We can also specify the arguments directly, by using the Windows console (StartRun…, then type ‘cmd’ and drag the executable into the window. Then type the arguments and <Enter>)
Helper functions – atoi/atof int atoi(char s[]); double atof(char s[]); • Command line arguments are received in the form of strings • These functions are used when we want to transform them into numbers • For example – atof(“13.5”) returns the number 13.5. • Must #include <stdlib.h>
Exercise • Write a program that accepts two numbers as command line arguments, representing a rectangle’s height and width (as floating-point numbers). • The program should display the rectangle’s area and perimeter
Solution (args_rectangle.c) int main(int argc, char* argv[]) { double width, height; if (argc != 3) { printf("Wrong number of arguments!\n"); return 1; } width = atof(argv[1]); height = atof(argv[2]); printf("The rectangle's area is %g\n", width * height); printf("The rectangle's perimeter is %g\n", 2 * (width + height)); return 0; }