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. 

C

#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"?

Tick

char *str1 = \"Geeks \"; can be changed to char str1[100] = \"Geeks \";

Cross

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

Cross

A line a[m+n-1] = \'\\0\' is added at the end of myStrcat

Cross

A line \'a = (char *)malloc(sizeof(char)*(strlen(a) + strlen(b) + 1)) is added at the beginning of myStrcat()



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. 

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;
}
Tick
n1 = 10, n2 = 9
Cross
n1 = 10, n2 = 10
Cross
n1 = 9, n2 = 9
Cross
n1 = 9, n2 = 10


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;
}
Cross
str1 is Quiz, str2 is Geeks
Tick
str1 is Geeks, str2 is Quiz
Cross
str1 is Geeks, str2 is Geeks
Cross
str1 is Quiz, str2 is Quiz


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;
}
Cross
10
Tick
9
Cross
8
Cross
Random Number


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]) ;
Cross
GATE2011
Cross
E2011
Tick
2011
Cross
011


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;
}
Cross

Runtime Error

Cross

Compiler Error

Cross

uiz uiz uiz u u u

Tick

Quiz Quiz Quiz u u u



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; 
}
Cross

arr
 

Tick

(arr+5)
 

Cross

(arr+4)
 

Cross

Not possible
 



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;
}
Cross
Compiler Error
Cross
geeksquiz followed by garbage characters
Tick
geeksquiz
Cross
Runtime Error


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)
Cross
gnirts
Cross
gnirt
Cross
string
Tick
no output is printed


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

The Output of the following C code will be?

C

#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;
}
Cross

GeeksQuiz

Cross

geeksquiz

Tick

Compiler dependent

Cross

Runtime Error



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.


  • Last Updated : 28 Sep, 2023

Share your thoughts in the comments
Similar Reads