Bird
Raised Fist0
Cprogramming~10 mins

perror and strerror functions - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - perror and strerror functions
Error Occurs
↓
Call perror(msg)
→Prints: msg + error description
↓
OR
↓
Call strerror(errno)
→Returns error description string
↓
Use returned string for custom output
When an error happens, perror prints a message plus the error text. strerror returns the error text as a string to use in your code.
Execution Sample
C
#include <stdio.h>
#include <string.h>
#include <errno.h>

int main() {
  FILE *f = fopen("nofile.txt", "r");
  if (!f) perror("File open error");
  return 0;
}
This code tries to open a missing file and uses perror to print the error message.
Execution Table
StepActionerrno ValueFunction CalledOutput
1Try to open 'nofile.txt' for reading2 (ENOENT)fopenNULL returned (file not found)
2Check if fopen returned NULL2if conditionTrue, enter error handling
3Call perror("File open error")2perrorFile open error: No such file or directory
4Program ends2return 0No output
💡 fopen fails, errno set to 2 (file not found), perror prints message, program ends
Variable Tracker
VariableStartAfter fopenAfter perrorFinal
fundefinedNULLNULLNULL
errno0222
Key Moments - 3 Insights
Why does perror print both my message and the error description?
perror automatically appends the system error message for the current errno after your message, as shown in step 3 of the execution_table.
What does strerror(errno) return and how is it different from perror?
strerror(errno) returns a string describing the error but does not print it. You can use it to build custom messages, unlike perror which prints directly (see concept_flow).
Why is errno set after fopen fails?
When fopen fails, it sets errno to indicate the error cause (like file not found). This is why perror and strerror can show the correct message (see step 1 and 2 in execution_table).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the value of errno after fopen fails?
A1
B2
C0
DUndefined
💡 Hint
Check step 1 and 2 in the execution_table where errno is shown after fopen fails.
At which step does perror print the error message?
AStep 1
BStep 2
CStep 3
DStep 4
💡 Hint
Look at the 'Function Called' and 'Output' columns in the execution_table.
If we replace perror with printf("Error: %s\n", strerror(errno)), what changes in output?
AOutput will miss the custom message prefix
BOutput will be the same
COutput will include extra system info
DNo output will be printed
💡 Hint
Refer to the concept_flow and key_moments about how perror and strerror differ in output.
Concept Snapshot
perror(msg): prints msg + system error text for errno
strerror(errno): returns error text string for errno
Use perror for quick error print
Use strerror for custom error handling
errno holds last error code set by system calls
Full Transcript
When a system call or library function fails, it sets a global variable called errno to a number representing the error. The perror function prints a message you give it, followed by a colon and the system's description of that error number. The strerror function returns the error description as a string, so you can use it in your own messages. In the example, fopen tries to open a file that does not exist, so it returns NULL and sets errno to 2, meaning 'No such file or directory'. Then perror prints 'File open error: No such file or directory'. This helps you understand what went wrong quickly. strerror can be used if you want to build your own error messages instead of printing directly.

Practice

(1/5)
1. What does the perror function do in C?
easy
A. Prints a custom message followed by the system error message
B. Returns a string describing an error number
C. Terminates the program immediately
D. Clears the error state of the program

Solution

  1. Step 1: Understand perror purpose

    perror prints a message you provide, then adds the system error message related to the last error.
  2. Step 2: Compare with other options

    strerror returns a string but does not print; program termination or clearing errors are unrelated.
  3. Final Answer:

    Prints a custom message followed by the system error message -> Option A
  4. Quick Check:

    perror prints message + system error [OK]
Hint: perror prints errors; strerror returns error strings [OK]
Common Mistakes:
  • Confusing perror with strerror
  • Thinking perror returns a string
  • Assuming perror stops the program
2. Which of the following is the correct syntax to print an error message using perror with the text "File error"?
easy
A. perror(File_error);
B. perror(File error);
C. perror("File error");
D. perror('File error');

Solution

  1. Step 1: Check correct string syntax in C

    Strings must be in double quotes, so "File error" is correct.
  2. Step 2: Validate perror usage

    perror takes a const char* string, so perror("File error") is correct syntax.
  3. Final Answer:

    perror("File error"); -> Option C
  4. Quick Check:

    Use double quotes for strings in perror [OK]
Hint: Use double quotes for strings in perror [OK]
Common Mistakes:
  • Using single quotes instead of double quotes
  • Passing variable names without quotes
  • Missing parentheses in function call
3. What will be the output of the following C code snippet if errno is set to ENOENT (No such file or directory)?
#include <stdio.h>
#include <string.h>
#include <errno.h>

int main() {
    printf("Error: %s\n", strerror(errno));
    return 0;
}
medium
A. Error: strerror function not found
B. Error: Permission denied
C. Error: Unknown error
D. Error: No such file or directory

Solution

  1. Step 1: Understand strerror(errno)

    strerror returns a string describing the error number stored in errno.
  2. Step 2: Match errno value to message

    ENOENT means "No such file or directory", so strerror(errno) returns that message.
  3. Final Answer:

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

    strerror(ENOENT) = "No such file or directory" [OK]
Hint: strerror(errno) shows error message for current error [OK]
Common Mistakes:
  • Confusing error messages for different errno values
  • Assuming strerror prints instead of returns string
  • Not including header
4. Identify the error in this code snippet that tries to print an error message:
#include <stdio.h>
#include <string.h>
#include <errno.h>

int main() {
    int errnum = ENOENT;
    printf("Error: %s\n", perror(errnum));
    return 0;
}
medium
A. Using perror inside printf is incorrect; perror prints directly and returns void
B. Missing header
C. Incorrect error number assigned to errnum
D. printf format specifier %s should be %d

Solution

  1. Step 1: Check perror return type

    perror prints directly to stderr and returns void; it does not return a string.
  2. Step 2: Analyze usage inside printf

    Passing perror(errnum) inside printf is invalid because perror returns void, not a string.
  3. Final Answer:

    Using perror inside printf is incorrect; perror prints directly and returns void -> Option A
  4. Quick Check:

    perror prints itself, don't use inside printf [OK]
Hint: perror prints error; don't use inside printf [OK]
Common Mistakes:
  • Using perror inside printf expecting a string
  • Confusing perror and strerror return types
  • Ignoring compiler warnings about void return
5. You want to write a function that opens a file and prints a clear error message if it fails. Which approach correctly uses perror and strerror together to achieve this?
FILE *open_file(const char *filename) {
    FILE *f = fopen(filename, "r");
    if (!f) {
        // What to do here?
    }
    return f;
}
hard
A. Call perror(filename) without message, then return NULL
B. Call perror("Failed to open file") to print error, then return NULL
C. Print printf("Error: %s\n", strerror(errno)) only, then return NULL
D. Return NULL without printing any error message

Solution

  1. Step 1: Understand error reporting with perror

    perror prints your message plus the system error, making it clear why fopen failed.
  2. Step 2: Compare options for clarity

    Call perror("Failed to open file") to print error, then return NULL uses perror("Failed to open file"), which is clear and standard. Print printf("Error: %s\n", strerror(errno)) only, then return NULL prints only strerror message without context. Call perror(filename) without message, then return NULL prints filename only, which is less clear. Return NULL without printing any error message prints nothing.
  3. Final Answer:

    Call perror("Failed to open file") to print error, then return NULL -> Option B
  4. Quick Check:

    Use perror with custom message for clear errors [OK]
Hint: Use perror with custom text for clear error messages [OK]
Common Mistakes:
  • Printing strerror without context message
  • Using perror with filename only, confusing output
  • Not printing any error message on failure
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