Note sure about the "best" solution, but here's how I'd do it in C++: #include <string> #include <iostream> using namespace std; bool is_palindrome(const string &inputString) { for(int i = 0, j = inputString.size() - 1; i < j; i++, j--) if (inputString[i] != inputString[j]) return false; return true; } int main(int argc, char *argv[]) { if (argc != 2) cout << "Usage: " << argv[0] << " <string>" << endl; else cout << "The string '" << argv[1] << "' is " << (is_palindrome(argv[1]) ? "" : "not ") << "a palindrome." << endl; return 0; } But since you mentioned close-to-the-metal, I endeavored to do it in C instead: #include <stdio.h> #include <string.h> int is_palindrome(const char *inputString) { int i, j; if (inputString) for(i = 0, j = strlen(inputString) - 1; i < j; i++, j--) if (inputString[i] != inputString[j]) return 0; return 1; } int main(int argc, char *argv[]) { if (argc != 2) printf("Usage: %s <string>\n", argv[0]); else printf("The string '%s' is %sa palindrome.\n", argv[1], (is_palindrome(argv[1]) ? "" : "not ")); return 0; } Note that in both cases, the loop conditional in `is_palindrome` also ensures that the empty string qualifies as a palindrome, without improperly attempting to access a character at index `-1`.