Programming in C

Working with Text

Gerald Senarclens de Grancy

Terminology

  • String
  • Standard input, standard output and standard error
  • Operator
    • A symbol representing an operation (eg.: mathematical operation)
    • There are arithmetic, logical, assignment, ... operators
  • Operator precedence
    • When in doubt, use parenthesis.
    • In order to make your code more readable, use parenthesis.
  • while loops

What is a String?

  • Sequence of characters
    • Details depend on the programming language
  • A C-string is a character array (char[])
  • C-strings are terminated with a character '\0'
char text[] = "Freedom";
Index 0 1 2 3 4 5 6 7
Value F r e e d o m \0
Address 0x7fffc8c013e4 0x7fffc8c013e5 0x...e6 0x...e7 0x...e8 0x...e9 0x...ea 0x...eb

Download what_is_a_string.c

Purpose of Working with Text

Which problems do C strings solve?

  • Input/output (I/O) required for basic communication with users
  • User interaction requires text
  • Prerequisite for reading and writing textual files
  • ...

Which problems do C strings cause?

  • C strings are "dumb" (not even aware of their length)
  • Limited to extended ASCII
  • Hard to use compared to higher level languages
  • Security implications of C string functions

Reading User Input

I/O functions are included via stdio.h

  • scanf(.) can read user input, but has security problems
  • Some compilers offer scanf_s(.)
    • non-standard and hence not portable
  • Solution: fgets(.) + sscanf(.)
    • fgets(char *s, int size, FILE *stream) reads in at most one less than size characters; includes final newline
    • sscanf(const char *str, const char *format, ...) scans input according to format

Example: Read a Single Number

#include <stdio.h>

int main() {
char line[5]; // max. 4 characters + \0
int number = 0;
printf("enter an integer (0 <= number <= 9999): ");
fgets(line, sizeof(line), stdin);
printf("You entered the text `%s`.\n", line);
sscanf(line, "%d", &number);
printf("This text, represented as an integer is `%d`.\n", number);
}

Download read_number.c

Example: Read Two Numbers

#include <stdio.h>

int main() {
char line[10]; // max. 9 characters + \0
int first = 0; int second = 0;
printf("enter two integers separated by a space (0 <= number <= 9999): ");
fgets(line, sizeof(line), stdin);
printf("You entered the text `%s`.\n", line);
sscanf(line, "%d %d", &first, &second);
printf("The numbers you entered are `%d` and `%d`.\n", first, second);
}

Download read_numbers.c

Example: Read a String

fgets(.) also includes the final newline (if it fits the size of the buffer)

#include <stdio.h>
#include <string.h>

int main() {
char line[15]; // max. 14 characters + \0
printf("enter your first name: ");
fgets(line, 15, stdin);
printf("{begin}%s{end}\n", line);
line[strcspn(line, "\n")] = 0; // remove final newline; '\0' == 0
printf("{begin}%s{end}\n", line);
return 0;
}

Download read_string.c

String Functions

String functions are included via string.h and strings.h

Using string functions may lead to security issues.

stpcpy, strcasecmp, strcat, strchr, strcmp, strcoll, strcpy, strcspn, strdup, strfry, strlen, strncat, strncmp, strncpy, strncasecmp, strpbrk, strrchr, strsep, strspn, strstr, strtok, strxfrm, index, rindex

To get help, consult your manual :)

man 3 string

toupper(int c) and tolower(int c) are included via ctype.h

Example: Copy a String

#include <stdio.h>
#include <string.h>

int main() {
char name[] = "Pat";
char destination[10];
strcpy(destination, name);
printf("Destination is `%s`\n", destination);
return 0;
}

source/c/strings/copy_string.c

Iterating Over a String

It is possible to iterate over a string using a while loop. The syntax is

while (condition) {
// statements that repeat as long as `condition` evaluates to true
}

Loops can be interrupted with break.
The current iteration can be ended using continue.

while (condition) {
// block of statements
if (skip_remaining_iteration) {
continue; // skip rest of this iteration
}
if (loop_should_end_now) {
break; // leave the loop
}
}

Example: Convert String to Upper Case

#include <stdio.h>
#include <ctype.h>

int main() {
char input_text[] = "The world is beautiful!";
unsigned short index = 0;
while (input_text[index]) { // while char is not '\0'
input_text[index] = toupper(input_text[index]);
index++;
}
printf("changed input_text: `%s`\n", input_text);
return 0;
}

source/c/strings/to_upper.c

Questions
and feedback...