Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reading a string with scanf

Tags:

c

scanf

People also ask

How do I scanf strings?

We can take string input in C using scanf(“%s”, str).

Can we use scanf () to read string with blank spaces?

1) Read string with spaces by using "%[^\n]" format specifier. The format specifier "%[^\n]" tells to the compiler that read the characters until "\n" is not found. See the output, now program is able to read complete string with white space.

Why is scanf not used to read a line of text?

In C scanf() requires pointers to the variable in which the value is to be stored. Therefore we pass address of the variables using & where as the string variable stores the address of the first location of the string. Hence we dont need to use & while reading strings.

Can we use %s in scanf?

In scanf() you usually pass an array to match a %s specifier, then a pointer to the first element of the array is used in it's place. For other specifiers like %d you need to pass the address of the target variable to allow scanf() to store the result in it.


An array "decays" into a pointer to its first element, so scanf("%s", string) is equivalent to scanf("%s", &string[0]). On the other hand, scanf("%s", &string) passes a pointer-to-char[256], but it points to the same place.

Then scanf, when processing the tail of its argument list, will try to pull out a char *. That's the Right Thing when you've passed in string or &string[0], but when you've passed in &string you're depending on something that the language standard doesn't guarantee, namely that the pointers &string and &string[0] -- pointers to objects of different types and sizes that start at the same place -- are represented the same way.

I don't believe I've ever encountered a system on which that doesn't work, and in practice you're probably safe. None the less, it's wrong, and it could fail on some platforms. (Hypothetical example: a "debugging" implementation that includes type information with every pointer. I think the C implementation on the Symbolics "Lisp Machines" did something like this.)