Exercise 5-6. Rewrite appropriate programs from earlier chapters and exercises with pointers instead of array indexing. Good possibilities include getline() (Chapters 1 and 4), atoi(), itoa(), and their variants (Chapters 2, 3, and 4), reverse() (Chapter 3), and strindex() and getop() (Chapter 4).
#include <stdio.h> // for printf(), scanf()
#define LENGTH 100 // max word length
void lower(char *); // to lower case
void upper(char *); // to upper case
int main()
{
char s[LENGTH];
printf("Enter a word in lower case: ");
scanf("%s", s);
printf("upper(%s) = ", s);
upper(s);
printf("%s\n", s);
printf("Enter a word in upper case: ");
scanf("%s", s);
printf("lower(%s) = ", s);
lower(s);
printf("%s\n", s);
return 0;
}
void lower(char *s) // to lower case
{
for ( ; *s != '\0'; s++)
{
if (*s >= 'A' && *s <= 'Z')
{*s = *s + 'a' - 'A';} // 'a' > 'A' in ASCII
}
}
void upper(char *s) // to upper case
{
for ( ; *s != '\0'; s++)
{
if (*s >= 'a' && *s <= 'z')
{*s = *s - 'a' + 'A';} // *s - ('a' - 'A')
}
}
/*
gcc case.c -o case
./case
Enter a word in lower case: Hello,
upper(Hello,) = HELLO,
Enter a word in upper case: World!
lower(World!) = world!
*/
*****************************************************************************************
*****************************************************************************************
*****************************************************************************************
*****************************************************************************************
*****************************************************************************************
#include <stdio.h> // for printf(), scanf()
#define LENGTH 100 // max word length
void lower(char *); // to lower case
void upper(char *); // to upper case
int main()
{
char s[LENGTH];
printf("Enter a word in lower case: ");
scanf("%s", s); upper(s);
printf("%s\n", s);
printf("Enter a word in upper case: ");
scanf("%s", s); lower(s);
printf("%s\n", s);
return 0;
}
void lower(char *s) // to lower case
{
for ( ; *s != '\0'; s++)
{
(*s >= 'A' && *s <= 'Z') ?
*s = (*s + 'a' - 'A') : 1; // 'a' > 'A' in ASCII
} // compiler requires an expression after : (1 is an expression)
}
void upper(char *s) // to upper case
{
for ( ; *s != '\0'; s++)
{
(*s >= 'a' && *s <= 'z') ?
*s = (*s - 'a' + 'A') : 0; // *s - ('a' - 'A')
} // compiler requires an expression after : (0 is an expression)
}
/*
gcc case1.c -o case1
./case1
Enter a word in lower case: Hello,
HELLO,
Enter a word in upper case: World!
world!
*/
*****************************************************************************************
*****************************************************************************************
*****************************************************************************************
#include <stdio.h> // for printf(), scanf()
#define LENGTH 100 // max word length
int lower (int c); // char to lower case
int upper (int c); // char to upper case
void lowers(char *); // string to lower case
void uppers(char *); // string to upper case
// inefficient variant (too many function calls)
int main()
{
char s[LENGTH];
printf("Enter a word in lower case: ");
scanf("%s", s);
printf("uppers(%s) = ", s);
uppers(s);
printf("%s\n", s);
printf("Enter a word in upper case: ");
scanf("%s", s);
printf("lowers(%s) = ", s);
lowers(s);
printf("%s\n", s);
return 0;
}
int lower (int c) // char to lower case
{
return (c >= 'A' && c <= 'Z') ?
(c + 'a' - 'A') : c; // 'a' > 'A' in ASCII
}
int upper (int c) // char to upper case
{
return (c >= 'a' && c <= 'z') ?
(c - 'a' + 'A') : c; // c - ('a' - 'A')
}
void lowers(char *s) // string to lower case
{
for ( ; *s != '\0'; s++)
{
*s = lower(*s);
}
}
void uppers(char *s) // string to upper case
{
int i;
for (i = 0; *s != '\0'; s++)
{
*s = upper(*s);
}
}
/*
gcc case2.c -o case2
./case2
Enter a word in lower case: Hello,
uppers(Hello,) = HELLO,
Enter a word in upper case: World!
lowers(World!) = world!
*/
*****************************************************************************************
*****************************************************************************************
*****************************************************************************************
*****************************************************************************************
*****************************************************************************************
#include <stdio.h> // for printf()
#define SIZE 100 // array size
void escape(char *s, char *t); // copy t to s making escapes visible
void unescape(char *s, char *t); // copy t to s doing the opposite
int main()
{
char s[SIZE];
char t[SIZE] = "\', \", \t, \n, \r, \f, \v, \a, \b, \\, etc.";
printf("String with escapes: %s\n", t);
escape(s,t);
printf("Visible escapes: %s\n", s);
unescape(t,s);
printf("Real characters: %s\n", t);
return 0;
}
void escape(char *s, char *t) // copy t to s making escapes visible
{
for ( ; *t != '\0'; t++)
{
switch(*t)
{
case '\'' :
*s++ = '\\'; *s++ = '\'';
break;
case '\"' :
*s++ = '\\'; *s++ = '\"';
break;
case '\t' :
*s++ = '\\'; *s++ = 't';
break;
case '\n' :
*s++ = '\\'; *s++ = 'n';
break;
case '\r' :
*s++ = '\\'; *s++ = 'r';
break;
case '\f' :
*s++ = '\\'; *s++ = 'f';
break;
case '\v' :
*s++ = '\\'; *s++ = 'v';
break;
case '\a' :
*s++ = '\\'; *s++ = 'a';
break;
case '\b' :
*s++ = '\\'; *s++ = 'b';
break;
case '\\' :
*s++ = '\\'; *s++ = '\\';
break;
default:
*s++ = *t; // copy non-escapes
break;
}
}
*s = '\0'; // properly end string
}
void unescape(char *s, char *t) // copy t to s turning \t into tab, etc.
{
for ( ; *t != '\0'; t++)
{
switch(*t)
{
case '\\' :
switch(*(t+1))
{
case '\'' : case '\"' : case '\\' :
*s++ = *(t+1);
t++;
break;
case 't' :
*s++ = '\t';
t++;
break;
case 'n' :
*s++ = '\n';
t++;
break;
case 'r' :
*s++ = '\r';
t++;
break;
case 'f' :
*s++ = '\f';
t++;
break;
case 'v' :
*s++ = '\v';
t++;
break;
case 'a' :
*s++ = '\a';
t++;
break;
case 'b' :
*s++ = '\b';
t++;
break;
default:
*s++ = *t;
break;
}
break;
default:
*s++ = *t;
break;
}
}
*s = '\0'; // properly end string
}
/*
gcc escapes.c -o escapes
./escapes
String with escapes: ', ", ,
,
,
, ,, \, etc.
Visible escapes: \', \", \t, \n, \r, \f, \v, \a, \b, \\, etc.
Real characters: ', ", ,
,
,
, ,, \, etc.
*/