Bird
Raised Fist0
Cprogramming~10 mins

Using errno in C - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Using errno
Start program
↓
Call function that may fail
↓
Check if function failed
Yes↓
Read errno value
↓
Use errno to identify error
↓
Handle error or continue
↓
End program
The program calls a function that might fail, then checks errno to find out what error happened, and handles it accordingly.
Execution Sample
C
#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE *f = fopen("nofile.txt", "r");
    if (!f) printf("Error: %s\n", strerror(errno));
    return 0;
}
This code tries to open a file that doesn't exist, then prints the error message using errno.
Execution Table
StepActionFunction Callerrno ValueOutput
1Start programNone0
2Call fopen("nofile.txt", "r")fopen2
3Check if fopen returned NULLNULL check2
4Read errno after failureerrno2
5Print error messagestrerror(errno)2Error: No such file or directory
6End programNone2
💡 fopen fails because file does not exist, errno is set to 2 (ENOENT)
Variable Tracker
VariableStartAfter fopenAfter checkFinal
fundefinedNULLNULLNULL
errno0222
Key Moments - 3 Insights
Why do we check if fopen returned NULL before reading errno?
Because errno is only meaningful if the function failed. Checking fopen's return (row 3) ensures we only read errno when an error happened.
Does errno reset automatically before each function call?
No, errno keeps its value until changed by a failing function. It should be set to 0 manually if you want to detect new errors reliably.
Why do we use strerror(errno) to print the error?
Because errno is just a number. strerror converts that number into a readable message (row 5 shows this).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the value of errno right after fopen fails?
A2
B0
C1
DUndefined
💡 Hint
Check Step 2 and Step 4 in the execution_table where errno is set after fopen fails.
At which step does the program print the error message?
AStep 3
BStep 4
CStep 5
DStep 6
💡 Hint
Look at the Output column in the execution_table to find when the error message appears.
If fopen succeeded, what would be the value of errno at Step 4?
A2
BIt would be unchanged from before
C0
DSome error code
💡 Hint
Refer to key_moments about errno not resetting automatically and only changing on failure.
Concept Snapshot
Using errno in C:
- Include <errno.h> and <string.h>
- Call a function that may fail (e.g., fopen)
- Check if function failed (e.g., fopen returns NULL)
- Read errno to get error code
- Use strerror(errno) to get readable message
- errno is set only on failure, not reset automatically
Full Transcript
This example shows how to use errno in C. The program tries to open a file that does not exist. fopen returns NULL to indicate failure. errno is set to 2, which means 'No such file or directory'. We check if fopen failed before reading errno. Then we use strerror(errno) to print a friendly error message. errno keeps its value until changed by another failing function. It does not reset automatically. This helps us understand how to detect and handle errors in C programs.

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