#include <stdio.h>
#include <string.h>
char str[50];
int main() {
int hasSign = 0;
printf("Enter your email: ");
scanf("%s", str);
// email validation
if (strchr(str, '@') != NULL) {
hasSign = 1;
}
printf("%s", hasSign "\n");
return 0;
}
How can I print a newline when I am printing the value of hasSign like in the upper code?
CodePudding user response:
There is a big bitfall here in the line printf("%s", hasSign "\n" );
"\n" is actually a pointer to const char (const char *) which is array of two characters: [0] = '\n', [1] = '\0' so when you add hasSign to it, it is actually doing pointer arithmetic.
To make it clear by example, let's say hasSign equals 0 so hasSign "\n" evaluates to 0 "\n" which is like &"\n"[0] = pointer to '\n' so a new line will printed in this case.
But when hasSign equals 1 so hasSign "\n" evaluates to 1 "\n" which is like &"\n"[1] = pointer to '\0' which is a null character or in other words 'nothing' and therefore nothing will be printed in this case.
To your question:
How can I print a newline when I am printing the value of hasSign like in the upper code?
you can do it like printf("%d\n", hasSign);
CodePudding user response:
You cannot concatenate strings with in C, nor convert numbers to strings by adding a number and a string. Your program compiles because hasSign "\n" is not a syntax error: adding a string and an integer evaluates to a pointer inside the string. The program will output a newline if hasSign is 0 and nothing of hasSign equals 1.
Here is a modified version that illustrates printf usage for string and integer arguments:
#include <stdio.h>
#include <string.h>
int main() {
char str[50];
int hasSign = 0;
printf("Enter your email: ");
if (scanf("Is", str) != 1) { // prevent scanf from writing beyond s[49]
// exit upon input error
return 1;
}
// email validation
if (strchr(str, '@') != NULL) {
hasSign = 1;
}
printf("email: %s, hasSign: %d\n", str, hasSign);
return 0;
}
