Strings
1. Write a program that reads a string of maximum 30 characters from the user and prints it in uppercase. Note that non-alphabet characters should be printed as is.
#include <stdio.h>
int main (int argc, char * argv[]) {
char str[31] = { '\0' };
printf("Enter a string (up to 30 characters) : ");
scanf("%30[^\n]s",str);
for(int i=0; i<31 && str[i]; i++) {
if(str[i]>='a' && str[i]<='z') {
printf("%c",str[i]-'a'+'A');
} else {
printf("%c",str[i]);
}
}
}
2. What shall be the output of above program for input “It’s a great time to become a good programmer”.
#include <stdio.h>
#include <string.h>
int main (int argc, char * argv[]) {
char message[256] = { 0 };
printf("Enter message of the day: ");
scanf("%255[^\n]s",message);
printf("Your message is %lu characters long\n", strlen(message));
return 0;
}
Ans: Your message is 47 characters long
3. Write a program that reads a string of maximum 30 characters from the user and prints the number of small case alphabets in the string entered by the user.
#include <stdio.h>
int main (int argc, char * argv[]) {
char str[31] = { '\0' };
int count=0;
printf("Enter a string (up to 30 characters) : ");
scanf("%30[^\n]s",str);
for(int i=0; i<31 && str[i]; i++) {
if(str[i]>='a' && str[i]<='z') {
count++;
}
}
printf("%s has %d small case alphabets\n", str, count);
}
4. Write a program that reads a string of maximum 30 characters from the user and prints the number of non-alphabet characters in the string entered by the user.
#include <stdio.h>
int main (int argc, char * argv[]) {
char str[31] = { '\0' };
int count=0;
printf("Enter a string (up to 30 characters) : ");
scanf("%30[^\n]s",str);
for(int i=0; i<31 && str[i]; i++) {
if(!((str[i]>='a' && str[i]<='z') || (str[i]>='A' && str[i]<='Z'))) {
count++;
}
}
printf("%s has %d non-alphabet characters\n", str, count);
}
5. Draw a flowchart for implementation of strcmp function.

6. Add NULL error checks to below implementation.
01: int my_strcmp (const char * s1, const char * s2) {
02: while ( (*s1 != '\0') && (*s1 == *s2) ) {
03: s1++;
04: s2++;
05: }
06: return (*s1-*s2);
07: }
int my_strcmp (const char * s1, const char * s2) {
if(s1 == NULL && s2!= NULL) {
return -*s2;
}
if(s2 == NULL && s1!= NULL) {
return *s1;
}
if(s1 == NULL && s2 == NULL) {
return 0;
}
while ( (*s1 != '\0') && (*s1 == *s2) ) {
s1++;
s2++;
}
return (*s1-*s2);
}
7. Trace control flow of above function for arguments
1. “C” and “Champion”
Ans:
- Control reaches line 02, s1 is pointing to “C” and s2 is pointing to “Champion”.
- Control condition evaluates to true, *s1 is not NULL and first character of both strings match.
- Control advances to line 03. s1 is incremented is now pointing to end of string.
- Control advances to line 04. s2 is incremented is now pointing to “hampion”.
- End of loop is reached, control jumps to line 02.
- Control condition evaluates to false. Control jumps outside loop, line 06.
- Value ‘\0’ – ‘h’ is returned.
2. “Top programmer” and “Top programmer”
Ans:
- Control reaches line 02, s1 is pointing to “Top programmer” and s2 is pointing to “Top programmer”.
- Control condition evaluates to true, *s1 is not NULL and first character of both strings match.
- Control advances to line 03. s1 is incremented is now pointing to “op programmer”.
- Control advances to line 04. s2 is incremented is now pointing to “op programmer”.
- End of loop is reached, control jumps to line 02.
- Steps 2-5 are repeated for each character of both strings until both s1 and s2 are pointing to respective end of strings.
- Control jumps to line 02.
- Control condition evaluates to false. Control jumps outside loop, line 06.
- Value ‘\0’ – ‘\0’ is returned.
8. Draw a flowchart for function strncmp.

9. Implement function strncmp.
int my_strncmp (const char * s1, const char * s2, unsigned int n) {
int count = 0;
while ( (*s1 != '\0') && (*s1 == *s2) && count != n-1) {
s1++;
s2++;
count++;
}
return (*s1-*s2);
}
10. Implement strcpy using while loop.
char * my_strcpy (char *dest, const char *src) {
int i = 0;
/*Loop terminates when end of src string is reached*/
while('\0' != src[i]) {
dest[i] = src[i];
i++;
}
dest[i] = '\0'; /*Terminate dest with null byte*/
return dest;
}
11. Draw a flowchart for function strncpy.

12. Implement function strncpy.
char * my_strncpy (char *dest, const char *src, unsigned int n) {
int i = 0;
for(;i<n && src[i]; i++) {
dest[i] = src[i];
}
return dest;
}