C String
Question 1 |
Consider the following code. The function myStrcat concatenates two strings. It appends all characters of b to end of a. So the expected output is "Geeks Quiz". The program compiles fine but produces segmentation fault when run.
#include <stdio.h> void myStrcat(char *a, char *b) { int m = strlen(a); int n = strlen(b); int i; for (i = 0; i <= n; i++) a[m+i] = b[i]; } int main() { char *str1 = "Geeks "; char *str2 = "Quiz"; myStrcat(str1, str2); printf("%s ", str1); return 0; }Which of the following changes can correct the program so that it prints "Geeks Quiz"?
char *str1 = "Geeks "; can be changed to char str1[100] = "Geeks "; | |
char *str1 = "Geeks "; can be changed to char str1[100] = "Geeks "; and a line a[m+n-1] = '\0' is added at the end of myStrcat | |
A line a[m+n-1] = '\0' is added at the end of myStrcat | |
A line 'a = (char *)malloc(sizeof(char)*(strlen(a) + strlen(b) + 1)) is added at the beginning of myStrcat() |
Discuss it
Question 1 Explanation:
In the above program "Geeks " and "Quiz" stored in read-only location but the line a[m+i]=b[i] tries to write a read only memory. The problem can be solved by storing str in writable stack segment. For more details see following. https://www.geeksforgeeks.org/storage-for-strings-in-c/
Question 2 |
What is the output of following program?
# include <stdio.h> int main() { char str1[] = "GeeksQuiz"; char str2[] = {'G', 'e', 'e', 'k', 's', 'Q', 'u', 'i', 'z'}; int n1 = sizeof(str1)/sizeof(str1[0]); int n2 = sizeof(str2)/sizeof(str2[0]); printf("n1 = %d, n2 = %d", n1, n2); return 0; }
n1 = 10, n2 = 9 | |
n1 = 10, n2 = 10 | |
n1 = 9, n2 = 9 | |
n1 = 9, n2 = 10 |
Discuss it
Question 2 Explanation:
The size of str1 is 10 and size of str2 9.
When an array is initialized with string in double quotes, compiler adds a '\0' at the end.
Question 3 |
What is the output of following program?
#include<stdio.h> void swap(char *str1, char *str2) { char *temp = str1; str1 = str2; str2 = temp; } int main() { char *str1 = "Geeks"; char *str2 = "Quiz"; swap(str1, str2); printf("str1 is %s, str2 is %s", str1, str2); return 0; }
str1 is Quiz, str2 is Geeks | |
str1 is Geeks, str2 is Quiz | |
str1 is Geeks, str2 is Geeks | |
str1 is Quiz, str2 is Quiz |
Discuss it
Question 3 Explanation:
The above swap() function doesn't swap strings. The function just changes local pointer variables and the changes are not reflected outside the function. See following for more details.
http://www.geeksforgeeks.org/swap-strings-in-c/
Question 4 |
Predict the output?
#include <stdio.h> int fun(char *str1) { char *str2 = str1; while(*++str1); return (str1-str2); } int main() { char *str = "GeeksQuiz"; printf("%d", fun(str)); return 0; }
10 | |
9 | |
8 | |
Random Number |
Discuss it
Question 4 Explanation:
The function fun() basically counts number of characters in input string. Inside fun(), pointer str2 is initialized as str1. The statement while(*++str1); increments str1 till ‘\0’ is reached. str1 is incremented by 9. Finally the difference between str2 and str1 is returned which is 9.
Question 5 |
What does the following fragment of C-program print?
char c[] = "GATE2011"; char *p =c; printf("%s", p + p[3] - p[1]) ;
GATE2011 | |
E2011 | |
2011 | |
011 |
Discuss it
Question 5 Explanation:
See comments for explanation.
char c[] = "GATE2011"; // p now has the base address string "GATE2011" char *p = c; // p[3] is 'E' and p[1] is 'A'. // p[3] - p[1] = ASCII value of 'E' - ASCII value of 'A' = 4 // So the expression p + p[3] - p[1] becomes p + 4 which is // base address of string "2011" printf("%s", p + p[3] - p[1]); // prints 2011
Question 6 |
C
#include<stdio.h> int main() { char str[] = "GeeksQuiz"; printf("%s %s %s ", &str[5], &5[str], str+5); printf("%c %c %c ", *(str+6), str[6], 6[str]); return 0; }
Runtime Error | |
Compiler Error | |
uiz uiz uiz u u u | |
Quiz Quiz Quiz u u u |
Discuss it
Question 6 Explanation:
The program has no error. All of the following expressions mean same thing &str[5] &5[str] str+5 Since compiler converts the array operation in pointers before accessing the array elements, all above result in same address. Similarly, all of the following expressions mean same thing. *(str+6) str[6] 6[str]
Question 7 |
In below program, what would you put in place of “?” to print “Quiz”?
C
#include <stdio.h> int main() { char arr[] = "GeeksQuiz"; printf("%s", ?); return 0; }
arr | |
(arr+5) | |
(arr+4) | |
Not possible |
Discuss it
Question 7 Explanation:
Since %s is used, the printf statement will print everything starting from arr+5 until it finds ‘\0’
Question 8 |
Output?
int main() { char a[2][3][3] = {'g','e','e','k','s','q','u','i','z'}; printf("%s ", **a); return 0; }
Compiler Error | |
geeksquiz followed by garbage characters | |
geeksquiz | |
Runtime Error |
Discuss it
Question 8 Explanation:
We have created a 3D array that should have 2*3*3 (= 18) elements, but we are initializing only 9 of them. In C, when we initialize less no of elements in an array all uninitialized elements become ‘\0′ in case of char and 0 in case of integers.
Question 9 |
Consider the following C program segment:
char p[20]; char *s = "string"; int length = strlen(s); int i; for (i = 0; i < length; i++) p[i] = s[length — i]; printf("%s", p);The output of the program is? (GATE CS 2004)
gnirts | |
gnirt | |
string | |
no output is printed |
Discuss it
Question 9 Explanation:
Let us consider below line inside the for loop
p[i] = s[length — i];
For i = 0, p[i] will be s[6 — 0] and s[6] is ‘\0′
So p[0] becomes ‘\0’. It doesn't matter what comes in p[1], p[2]….. as P[0] will not change for i >0. Nothing is printed if we print a string with first character ‘\0′
Question 10 |
#include <stdio.h> void my_toUpper(char* str, int index) { *(str + index) &= ~32; } int main() { char* arr = "geeksquiz"; my_toUpper(arr, 0); my_toUpper(arr, 5); printf("%s", arr); return 0; }
GeeksQuiz | |
geeksquiz | |
Compiler dependent |
Discuss it
Question 10 Explanation:
The memory for the string arr is allocated in the read/write only area of data section. The choice is compiler dependent. In the newer version of compilers, the memory is allocated in the read only section of the data area. So any modification in the string is not possible.
In older version compilers like Turbo-C, modification is possible.
There are 22 questions to complete.