/*
* strings.c -- show various important string functions
*
* Matt Bishop, ECS 36A
*
* April 30, 2024
* -- original program
*/
#include <stdio.h>
#include <string.h>
/*
* macro
*/
/* pause until newline typed */
#define PAUSE { printf("\nType ENTER to proceed >"); (void) getchar(); putchar('\n'); }
#define MAXLEN 1024 /* length of arrays */
/* * tis should be in string.h like the manual says, but apparently it isn't
* so we do it here to shut the compiler up
*/
char *strdup(char *);
/*
* the program
*/
int main(int argc, char *argv[])
{
char buf1[MAXLEN], buf2[MAXLEN], buf3[MAXLEN]; /* used to hold variations on strings */
char *av; /* pointer to argv[1] (for convenience) */
int i; /* used as temp storage for integer */
char *n; /* used as temp storage for char pointer */
/* check there is 1 argument only */
if (argc != 2){
fprintf(stderr, "Usage: %s string\n", argv[0]);
return(1);
}
av = argv[1];
/* strlen */
printf("Length of argument '%s': %ld\n", av, strlen(av));
PAUSE;
/* strcpy, strncpy */
printf("Copying the string: strcpy(buf, \"%s\")\n", av);
strcpy(buf1, av);
printf("\targument '%s', copy '%s'\n", av, buf1);
printf("Copying 1000 chars of the string: strncpy(buf, \"%s\", 1000)\n", av);
strcpy(buf2, "xxxxxxxxxxxxxx");
strncpy(buf2, av, 1000);
printf("\targument '%s', copy '%s'\n", av, buf2);
printf("Copying 2 chars of the string: strncpy(buf, \"%s\", 2)\n", av);
strcpy(buf3, "xxxxxxxxxxxxxx");
strncpy(buf3, av, 3);
printf("\targument '%s', copy '%s'\n", av, buf3);
PAUSE;
/* strcat, strncat */
printf("Concatening 2 copies of argument: strcat(buf1, \"%s\")\n", av);
strcat(buf1, av);
printf("\targument '%s', copy '%s'\n", av, buf1);
printf("Appending 1000 chars of the string: strncat(buf, \"%s\", 1000)\n", av);
strcpy(buf2, av);
strncat(buf2, av, 1000);
printf("\targument '%s', copy '%s'\n", av, buf2);
printf("Appending 2 chars of the string: strncat(buf, \"%s\", 2)\n", av);
strcpy(buf3, av);
strncat(buf3, av, 3);
printf("\targument '%s', copy '%s'\n", av, buf3);
PAUSE;
/* strcmp, strncmp */
printf("Compare string 'gleep' with argument: ");
if ((i = strcmp("gleep", av)) > 0)
printf("'gleep' comes before '%s'\n", av);
else if (i == 0)
printf("'gleep' is the same as '%s'\n", av);
else if (i < 0)
printf("'gleep' comes after '%s;\n", av);
printf("Compare the first 3 chars of string 'gleep' with argument:\n");
if ((i = strncmp("gleep", av, 3)) > 0)
printf("\t'gleep' comes before '%s'\n", av);
else if (i == 0)
printf("\t'gleep' is the same as '%s'\n", av);
else if (i < 0)
printf("\t'gleep' comes after '%s;\n", av);
PAUSE;
/* strchr, strrchr */
if ((n = strchr(av, 'h')) == NULL)
printf("'h' does not appear in '%s'\n", av);
else
printf("The chars after the first 'h' are '%s'\n", n);
if ((n = strrchr(av, 'h')) == NULL)
printf("'h' does not appear in '%s'\n", av);
else
printf("The chars after the last 'h' are '%s'\n", n);
PAUSE;
/* strstr */
if ((n = strstr(av, "hello")) == NULL)
printf("The string 'hello' doesn't appear in the argument\n");
else
printf("The chars after the string 'hello' are '%s'\n", n);
PAUSE;
/* strtok */
printf("break things 'a/bbb///cc;xxx:yyy' up\n");
printf("token separators are ':;' and '/'\n");
printf("first time through, we give strtok the string\n");
strcpy(buf1, "a/bbb///cc;xxx:yyy");
n = strtok(buf1, ":;/");
if (n == NULL)
printf("Tokens :;/ are not in the string\n");
else{
i = 1;
printf("Token %d: '%s'\n", i++, n);
while((n = strtok(NULL, ":;/")) != NULL)
printf("Token %d: '%s'\n", i++, n);
}
PAUSE;
/* strdup */
if ((n = strdup(av)) != NULL)
printf("A duplicate of %s is %s\n", av, n);
else
printf("Tried to duplicate %s but ran out of room\n", av);
/* all done */
return(0);
}
|
ECS 36A, Programming & Problem Solving Version of April 2, 2024 at 12:13PM
|
You can get the raw source code here. |