Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Read a string as an input using scanf

Tags:

c

scanf

I am new to C language and I am trying read a character and a string (a sentence; max-length 25) from a user.

Not sure what I am doing wrong in the following lines of code, its giving me an error "Segment Fault".

#include <stdio.h>

int main(){
    char * str[25];
    char car;

    printf("Enter a character: ");
    car = getchar();

    printf("Enter a sentence: ");
    scanf("%[^\n]s", &str);

    printf("\nThe sentence is %s, and the character is %s\n", str, car);

    return 0;
}

Thanks!

like image 550
Hafiz Temuri Avatar asked Jan 30 '16 15:01

Hafiz Temuri


People also ask

Why scanf is not used in take string as input?

In case of a string (character array), the variable itself points to the first element of the array in question. Thus, there is no need to use the '&' operator to pass the address.

How does %s work 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.

How do I scanf a string in C++?

Just use scanf("%s", stringName); or cin >> stringName; tip: If you want to store the length of the string while you scan the string, use this : scanf("%s %n", stringName, &stringLength); stringName is a character array/string and strigLength is an integer.


2 Answers

You have to make four changes:

  1. Change

    char * str[25];
    

    to

    char str[25];
    

    as you want an array of 25 chars, not an array of 25 pointers to char.

  2. Change

    char car;
    

    to

    int car;
    

    as getchar() returns an int, not a char.

  3. Change

    scanf("%[^\n]s", &str);
    

    to

    scanf( "%24[^\n]", str);
    

    which tells scanf to

    1. Ignore all whitespace characters, if any.
    2. Scan a maximum of 24 characters (+1 for the Nul-terminator '\0') or until a \n and store it in str.
  4. Change

    printf("\nThe sentence is %s, and the character is %s\n", str, car);
    

    to

    printf("\nThe sentence is %s, and the character is %c\n", str, car);
    

    as the correct format specifier for a char is %c, not %s.

like image 134
Spikatrix Avatar answered Oct 25 '22 23:10

Spikatrix


str is an array of 25 pointers to char, not an array of char. So change its declaration to

char str[25];

And you cannot use scanf to read sentences--it stops reading at the first whitespace, so use fgets to read the sentence instead.

And in your last printf, you need the %c specifier to print characters, not %s. You also need to flush the standard input, because there is a '\n' remaining in stdin, so you need to throw those characters out.

The revised program is now

#include <stdio.h>    
void flush();
int main()
{
    char str[25], car;

    printf("Enter a character\n");
    car = getchar();

    flush();

    printf("Enter a sentence\n");
    fgets(str, 25, stdin);

    printf("\nThe sentence is %s, and the character is %c\n", str, car);

    return 0;
}
void flush()
{
    int c;
    while ((c = getchar()) != '\n' && c != EOF)
        ;
}
like image 45
Edward Karak Avatar answered Oct 25 '22 23:10

Edward Karak