Bird
Raised Fist0
Cprogramming~20 mins

Using errno in C - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Errno Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this code using errno after fopen fails?
Consider the following C code snippet that tries to open a non-existent file. What will it print?
C
#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE *fp = fopen("nonexistent.txt", "r");
    if (!fp) {
        printf("Error code: %d\n", errno);
        printf("Error message: %s\n", strerror(errno));
    }
    return 0;
}
A
Error code: 0
Error message: Success
B
Error code: 2
Error message: No such file or directory
C
Error code: 13
Error message: Permission denied
D
Error code: 22
Error message: Invalid argument
Attempts:
2 left
💡 Hint
errno is set by system calls and library functions when an error occurs. fopen returns NULL on failure and sets errno.
🧠 Conceptual
intermediate
1:30remaining
What does errno represent in C?
Choose the best description of what errno is used for in C programming.
AA global variable set by system calls and library functions to indicate the error code of the last error.
BA function that returns the last error message as a string.
CA constant integer representing the number of errors encountered since program start.
DA macro that clears all errors in the program.
Attempts:
2 left
💡 Hint
Think about how C functions communicate errors without exceptions.
🔧 Debug
advanced
2:00remaining
Why does this code print 'Error code: 0' even after fopen fails?
Examine the code below. It tries to open a file that does not exist but prints 'Error code: 0'. What is the cause?
C
#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    errno = 0;
    FILE *fp = fopen("missing.txt", "r");
    if (!fp) {
        printf("Error code: %d\n", errno);
        printf("Error message: %s\n", strerror(errno));
    }
    return 0;
}
Aerrno must be checked immediately after fopen; some functions reset errno if not checked quickly.
Berrno was set to 0 before fopen, but fopen did not set errno on failure in this environment.
Cfopen succeeded, so errno remains 0.
DThe program forgot to include <errno.h>, so errno is undefined.
Attempts:
2 left
💡 Hint
errno is only meaningful immediately after a failing function call.
📝 Syntax
advanced
2:00remaining
Which option correctly declares and uses errno to check an error after a system call?
Select the code snippet that correctly uses errno to detect an error after calling a system function.
A
#include &lt;errno.h&gt;
#include &lt;stdio.h&gt;

int main() {
    int errno = 0;
    int result = remove("file.txt");
    if (result == -1) {
        printf("Error: %s\n", strerror(errno));
    }
    return 0;
}
B
#include &lt;stdio.h&gt;

int main() {
    int result = remove("file.txt");
    if (result != 0) {
        printf("Error: %s\n", strerror(errno));
    }
    return 0;
}
C
#include &lt;errno.h&gt;
#include &lt;stdio.h&gt;

int main() {
    int result = remove("file.txt");
    if (result != 0) {
        printf("Error: %s\n", strerror(errno));
    }
    return 0;
}
D
#include &lt;errno.h&gt;
#include &lt;stdio.h&gt;

int main() {
    int result = remove("file.txt");
    if (result == 0) {
        printf("Error: %s\n", strerror(errno));
    }
    return 0;
}
Attempts:
2 left
💡 Hint
Do not redeclare errno as a local variable. Check the function's return value correctly.
🚀 Application
expert
2:30remaining
How many distinct error messages can this code print when opening files?
Given the code below, how many different error messages can it print if the file opening fails?
C
#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    const char *files[] = {"file1.txt", "file2.txt", "file3.txt"};
    for (int i = 0; i < 3; i++) {
        FILE *fp = fopen(files[i], "r");
        if (!fp) {
            printf("File: %s, Error: %s\n", files[i], strerror(errno));
        } else {
            fclose(fp);
        }
    }
    return 0;
}
A0
B1
C3
DDepends on the system and file permissions
Attempts:
2 left
💡 Hint
Error messages depend on why fopen fails, which can vary by file and system.

Practice

(1/5)
1. What is the primary purpose of errno in C programming?
easy
A. To store error codes set by system or library functions when they fail
B. To count the number of errors in a program
C. To reset the program state after an error
D. To display error messages automatically

Solution

  1. Step 1: Understand what errno stores

    errno is a global variable that stores error codes set by system or library functions when they fail.
  2. Step 2: Differentiate from other options

    It does not count errors, reset program state, or display messages automatically.
  3. Final Answer:

    To store error codes set by system or library functions when they fail -> Option A
  4. Quick Check:

    errno stores error codes = C [OK]
Hint: Remember: errno holds error codes after failure [OK]
Common Mistakes:
  • Thinking errno counts errors
  • Assuming errno resets program state
  • Believing errno prints messages automatically
2. Which of the following is the correct way to include errno in a C program?
easy
A. #include
B. #include
C. #include
D. #include

Solution

  1. Step 1: Identify the standard header for errno

    The standard header file to use errno is <errno.h>.
  2. Step 2: Verify other options

    <error.h>, <err.h>, and <errors.h> are not standard headers for errno.
  3. Final Answer:

    #include <errno.h> -> Option B
  4. Quick Check:

    errno header = <errno.h> [OK]
Hint: Use #include to access errno [OK]
Common Mistakes:
  • Using wrong header files
  • Forgetting to include errno.h
  • Confusing with similar-sounding headers
3. What will the following C code print if the file nonexistent.txt does not exist?
#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE *f = fopen("nonexistent.txt", "r");
    if (!f) {
        printf("Error: %s\n", strerror(errno));
    }
    return 0;
}
medium
A. Error: No such file or directory
B. Error: Permission denied
C. Error: File exists
D. Error: Unknown error

Solution

  1. Step 1: Understand fopen failure and errno

    When fopen fails to open a non-existing file for reading, it sets errno to indicate the error, usually ENOENT meaning "No such file or directory".
  2. Step 2: Use strerror to get error message

    strerror(errno) converts the error code to a readable string, which will be "No such file or directory".
  3. Final Answer:

    Error: No such file or directory -> Option A
  4. Quick Check:

    fopen missing file error = "No such file or directory" [OK]
Hint: fopen missing file sets errno to ENOENT message [OK]
Common Mistakes:
  • Assuming errno is zero without checking fopen result
  • Confusing error messages for different errors
  • Not including string.h for strerror
4. Identify the error in this code snippet that uses errno:
#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    errno = 0;
    FILE *f = fopen("file.txt", "r");
    if (f == NULL) {
        perror("File open error");
    }
    if (errno != 0) {
        printf("Error code: %d\n", errno);
    }
    return 0;
}
medium
A. Using perror instead of strerror is incorrect
B. Setting errno to 0 before fopen is unnecessary
C. Checking errno after fopen without checking fopen result first
D. Not closing the file pointer after fopen

Solution

  1. Step 1: Analyze errno usage after fopen

    errno should only be checked if the function indicates failure. Here, errno is checked regardless of fopen result, which can be misleading.
  2. Step 2: Confirm correct error checking pattern

    The correct pattern is to check if fopen returned NULL before reading errno. This code checks errno even if fopen succeeded.
  3. Final Answer:

    Checking errno after fopen without checking fopen result first -> Option C
  4. Quick Check:

    Check function result before errno [OK]
Hint: Always check function result before reading errno [OK]
Common Mistakes:
  • Reading errno without function failure
  • Confusing perror and strerror usage
  • Ignoring file close after fopen
5. You want to open a file for reading and print a custom error message if it fails. Which code snippet correctly uses errno and strerror to do this?
A) FILE *f = fopen("data.txt", "r");
   if (!f) {
       printf("Error: %s\n", strerror(errno));
   }

B) errno = 0;
   FILE *f = fopen("data.txt", "r");
   if (f == NULL) {
       printf("Error: %s\n", strerror(errno));
   }

C) FILE *f = fopen("data.txt", "r");
   if (f == NULL) {
       errno = 0;
       printf("Error: %s\n", strerror(errno));
   }

D) FILE *f = fopen("data.txt", "r");
   if (f == NULL) {
       perror("Error opening file");
   }
hard
A. Option A
B. Option B
C. Option C
D. Option D

Solution

  1. Step 1: Check correct error handling with errno

    Option D uses perror, which is the standard and simplest way to print a custom error message along with the error string corresponding to errno. It automatically handles errno correctly.
  2. Step 2: Identify issues in other options

    Option D does not reset errno before fopen, which is less safe. Option D resets errno before fopen and checks failure, but it's generally unnecessary to reset errno before calls that set it on failure. Option D resets errno after failure, clearing the error code before printing, which is incorrect.
  3. Final Answer:

    Option D -> Option D
  4. Quick Check:

    Use perror for simple and correct error messages [OK]
Hint: Use perror for automatic error message printing [OK]
Common Mistakes:
  • Resetting errno unnecessarily
  • Resetting errno after failure
  • Using strerror without valid errno
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard