Strings: - A String Is A Sequence of Characters Treated As A Group - We Have Already Used Some String Literals
Strings: - A String Is A Sequence of Characters Treated As A Group - We Have Already Used Some String Literals
void main() {
char LastName[11];
char FirstName[11];
printf("\n%s:\n",fname);
while (fgets(buffer,sizeof(buffer)-1,instream)
!= NULL)
fputs(buffer,stdout);
fclose(instream);
}
Array of Strings
• Sometimes useful to have an array of string values
• Each string could be of different length (producing
a ragged string array)
• Example:
char *MonthNames[13]; /* an array of 13 strings */
MonthNames[1] = “January”; /* String with 8 chars */
MonthNames[2] = “February”; /* String with 9 chars */
MonthNames[3] = “March”; /* String with 6 chars */
etc.
Array of Strings Example
#include <stdio.h>
void main() {
char *days[7];
char TheDay[10];
int day;
days[0] = "Sunday";
days[1] = "Monday";
days[2] = "Tuesday";
days[3] = "Wednesday";
days[4] = "Thursday";
days[5] = "Friday";
days[6] = "Saturday";
Array of Strings Example
printf("Please enter a day: ");
scanf("%9s",TheDay);
day = 0;
while ((day < 7) && (!samestring(TheDay,days[day])))
day++;
if (day < 7)
printf("%s is day %d.\n",TheDay,day);
else
printf("No day %s!\n",TheDay);
}
Array of Strings Example
int samestring(char *s1, char *s2) {
int i;
/* Not same if not of same length */
if (strlen(s1) != strlen(s2))
return 0;
/* look at each character in turn */
for (i = 0; i < strlen(s1); i++)
/* if a character differs, string not same */
if (s1[i] != s2[i]) return 0;
return 1;
}
String Functions
• C provides a wide range of string functions for
performing different string tasks
• Examples
strlen(str) - calculate string length
strcpy(dst,src) - copy string at src to dst
strcmp(str1,str2) - compare str1 to str2
• Functions come from the utility library string.h
– #include <string.h> to use
Some String Functions from String.h
Function Purpose Example
strcpy Makes a copy of a strcpy(s1, “Hi”);
string
strcat Appends a string to the strcat(s1, “more”);
end of another string
strcmp Compare two strings strcmp(s1, “Hu”);
alphabetically
strlen Returns the number of strlen(“Hi”)
characters in a string returns 2.
strtok Breaks a string into strtok(“Hi, Chao”,
tokens by delimiters. “ ,”);
String Length
Syntax: int strlen(char *str)
returns the length (integer) of the string argument
counts the number of characters until an \0 encountered
does not count \0 char
Example:
char str1 = “hello”;
strlen(str1) would return 5
Copying a String
Syntax:
char *strcpy(char *dst, char *src)
copies the characters (including the \0) from the source string
(src) to the destination string (dst)
dst should have enough space to receive entire string (if not,
other data may get written over)
if the two strings overlap (e.g., copying a string onto itself) the
results are unpredictable
return value is the destination string (dst)
char *strncpy(char *dst, char *src, int n)
similar to strcpy, but the copy stops after n characters
if n non-null (not \0) characters are copied, then no \0 is copied
String Comparison
Syntax:
int strcmp(char *str1, char *str2)
compares str1 to str2, returns a value based on the first character
they differ at:
less than 0
if ASCII value of the character they differ at is smaller for
str1
or if str1 starts the same as str2 (and str2 is longer)
greater than 0
if ASCII value of the character they differ at is larger for str1
or if str2 starts the same as str1 (and str1 is longer)
0 if the two strings do not differ
String Comparison (cont)
strcmp examples:
strcmp(“hello”,”hello”) -- returns 0
strcmp(“yello”,”hello”) -- returns value > 0
strcmp(“Hello”,”hello”) -- returns value < 0
strcmp(“hello”,”hello there”) -- returns value < 0
strcmp(“some diff”,”some dift”) -- returns value < 0
expression for determining if two strings s1,s2 hold
the same string value:
!strcmp(s1,s2)
String Comparison (cont)
Sometimes we only want to compare first n chars:
int strncmp(char *s1, char *s2, int n)
Works the same as strcmp except that it stops at the
nth character
looks at less than n characters if either string is shorter
than n
strcmp(“some diff”,”some DIFF”) -- returns value > 0
strncmp(“some diff”,”some DIFF”,4) -- returns 0
strcpy/strcmp Example
#include <stdio.h>
#include <string.h>
void main() {
char fname[81];
char prevline[101] = "";
char buffer[101];
FILE *instream;
printf("Check which file: ");
scanf("%80s",fname);
if ((instream = fopen(fname,"r")) == NULL) {
printf("Unable to open file %s\n",fname);
exit(-1);
}
strcpy/strcmp Example
/* read a line of characters */
while (fgets(buffer,sizeof(buffer)-1,instream) != NULL) {
/* if current line same as previous */
if (!strcmp(buffer,prevline))
printf("Duplicate line: %s",buffer);
/* otherwise if the first 10 characters of the current
and previous line are the same */
else if (!strncmp(buffer,prevline,10))
printf(”Start the same:\n %s %s",prevline,buffer);
/* Copy the current line (in buffer) to the previous
line (in prevline) */
strcpy(prevline,buffer);
}
fclose(instream);
}
String Comparison (ignoring case)
Syntax:
int strcasecmp(char *str1, char *str2)
similar to strcmp except that upper and lower case characters
(e.g., ‘a’ and ‘A’) are considered to be equal
int strncasecmp(char *str1, char *str2, int n)
version of strncmp that ignores case
String Concatenation
Syntax:
char *strcat(char *dstS, char *addS)
appends the string at addS to the string dstS (after dstS’s
delimiter)
returns the string dstS
can cause problems if the resulting string is too long to fit in dstS
char *strncat(char *dstS, char *addS, int n)
appends the first n characters of addS to dstS
if less than n characters in addS only the characters in addS
appended
always appends a \0 character
strcat Example
#include <stdio.h>
#include <string.h>
void main() {
char fname[81];
char buffer[101];
char curraddress[201] = "";
FILE *instream;
int first = 1;
printf("Address file: ");
scanf("%80s",fname);
if ((instream = fopen(fname,"r")) == NULL) {
printf("Unable to open file %s\n",fname);
exit(-1);
}
strcat Example
/* Read a line */
while (fgets(buffer,sizeof(buffer)-1,instream) != NULL) {
if (buffer[0] == '*') { /* End of address */
printf("%s\n",curraddress); /* Print address */
strcpy(curraddress,""); /* Reset address to “” */
first = 1;
}
else {
/* Add comma (if not first entry in address) */
if (first) first = 0; else strcat(curraddress,", ");
/* Add line (minus newline) to address */
strncat(curraddress,buffer,strlen(buffer)-1);
}
}
fclose(instream);
}
Searching for a Character/String
Syntax:
char *strchr(char *str, int ch)
returns a pointer (a char *) to the first occurrence of ch in str
returns NULL if ch does not occur in str
can subtract original pointer from result pointer to determine
which character in array
char *strstr(char *str, char *searchstr)
similar to strchr, but looks for the first occurrence of the string
searchstr in str
char *strrchr(char *str, int ch)
similar to strchr except that the search starts from the end of
string str and works backward
strchr Example
#include <stdio.h>
#include <string.h>
void main() {
char fname[81];
char buffer[101];
char noncom[101];
FILE *instream;
char *loc;
printf("File: ");
scanf("%80s",fname);
if ((instream = fopen(fname,"r")) == NULL) {
printf("Unable to open file %s\n",fname);
exit(-1);
}
strchr Example
/* read line */
while (fgets(buffer,sizeof(buffer)-1,instream) != NULL) {
/* Look for the character % in the line */
if ((loc = strchr(buffer,'%')) != NULL) {
/* Copy the characters before the % to noncom */
strncpy(noncom,buffer,(loc - buffer));
/* Add a delimiter to noncom */
noncom[loc - buffer] = '\0';
printf("%s\n",noncom);
}
else
printf("%s",buffer);
}
flose(instream);
}
strstr Example
/* read line */
while (fgets(buffer,sizeof(buffer)-1,instream) != NULL) {
/* Look for the character % in the line */
if ((loc = strstr(buffer,”\\”)) != NULL) {
/* Copy the characters before the % to noncom */
strncpy(noncom,buffer,(loc - buffer));
/* Add a delimiter to noncom */
noncom[loc - buffer] = '\0';
printf("%s\n",noncom);
}
else
printf("%s",buffer);
}
flose(instream);
}
String Spans (Searching)
Syntax:
int strspn(char *str, char *cset)
specify a set of characters as a string cset
strspn searches for the first character in str that is not part of cset
returns the number of characters in set found before first non-set
character found
int strcspn(char *str, char *cset)
similar to strspn except that it stops when a character that is part
of the set is found
Examples:
strspn(“a vowel”,”bvcwl”) returns 2
strcspn(“a vowel”,”@,*e”) returns 5
Parsing Strings
The strtok routine can be used to break a string of
characters into a set of tokens
– we specify the characters (e.g., whitespace) that
separate tokens
– strtok returns a pointer to the first string corresponding
to a token, the next call returns the next pointer, etc.
– example:
call strtok repeatedly on “A short string\n” with whitespace
(space, \t, \n) as delimiters, should return
first call: pointer to string consisting of “A”
second call: pointer to string consisting of “short”
third call: pointer to string consisting of “string”
fourth call: NULL pointer
Parsing Strings
Syntax:
char *strtok(char *str, char *delimiters)
delimiters is a string consisting of the delimiter characters (are
ignored, end tokens)
if we call strtok with a string argument as the first argument it
finds the first string separated by the delimiters in str
if we call strtok with NULL as the first argument it finds the next
string separated by the delimiters in the string it is currently
processing
strtok makes alterations to the string str (best to make a copy of it
first if you want a clean copy)
strtok Example
#include <stdio.h>
#include <string.h>
void main() {
FILE *instream;
char fname[81];
char buffer[101]; /* current line */
char *token; /* pointer to current token */
char *tokens[100]; /* array of unique tokens in file */
int tokenline[100]; /* line number where token found */
int ntokens = 0; /* number of tokens found so far */
int linenum = 0; /* current line number */
int tnum;
printf("File: ");
scanf("%80s",fname);
fclose(instream);
}
Printing to a String
The sprintf function allows us to print to a string
argument using printf formatting rules
First argument of sprintf is string to print to,
remaining arguments are as in printf
Example:
char buffer[100];
sprintf(buffer,”%s, %s”,LastName,FirstName);
if (strlen(buffer) > 15)
printf(“Long name %s %s\n”,FirstName,LastName);
sprintf Example
#include <stdio.h> printf("File Prefix: ");
#include <string.h> scanf("%80s",basefname);
printf("Save to File: ");
void main() { scanf("%80s",savefname);
FILE *instream;
FILE *outstream; if ((outstream =
char basefname[81]; fopen(savefname,"w")) ==
char readfname[101]; NULL) {
char savefname[81]; printf("Unable to open %s\n",
char buffer[101]; savefname);
int fnum; exit(-1);
}
sprintf Example
for (fnum = 0; fnum < 5; fnum++) {
/* file name with basefname as prefix, fnum as suffix */
sprintf(readfname,"%s.%d",basefname,fnum);
fclose(instream);
}
fclose(outstream);
}
Reading from a String
The sscanf function allows us to read from a string
argument using scanf rules
First argument of sscanf is string to read from,
remaining arguments are as in scanf
Example:
char buffer[100] = “A10 50.0”;
sscanf(buffer,”%c%d%f”,&ch,&inum,&fnum);
/* puts ‘A’ in ch, 10 in inum and 50.0 in fnum */