1

I would like to read strings in while loop, until end of input, but I dont know how. For example, input is:

Car
Black car
White car

First, I want to scanf 'car' and save it in array. Then, I want to scanf 'Black car' and put it into aray, and so on.

 while (scanf("%[^\n]", s)>0)

This reads only one line, but when I use this code:

 while(scanf("%s", s) > 0)

It reads one word after another, so there will be no 'Black car', but 'black' and 'car'.

Do you have any idea to make this two conditions together?

And, I have got two nodes in linked list: first is 'White car' and second is 'Car black'. I want to sort it in alphabetical order. I want to get into array1 the first letter of 'White car', which is 'W' and into array 2 the first letter of 'Car black', which is 'C'. But when I printf array1, it print'W', but when I want to print array2, it writes 'CW'? When I printf one->name, it print 'White Car' and when I printf two->name, it print 'Car black'.

void sort(Car**head){
Car*one;
Car*two;
Car*temp;
one= *head;
two= one->next;

int compare;
char array1[1]={0};
char array2[1]={0};

while(one->next){
    compare= 0;
    strncpy(array1, one->name, 1);
    strncpy(array2, two->name, 1); 

    printf("Array1: %s\n", array1);
    printf("Array2: %s\n", array2);

    printf("One name: %s\n", one->name);
    printf("Two name: %s\n", two->name);

    compare= strcmp(one->name, two->name);
    if(compare<0){
        temp = one;
        one = two;
        two= temp;
    }
    one = one->next;
    two = two->next;
}                           

}

Hihaha
  • 13
  • 5
  • 3
    Don't use `scanf()` — use either standard C [`fgets()`](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fgets.html) or POSIX [`getline()`](http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html) — they both read lines. – Jonathan Leffler Nov 22 '19 at 13:59
  • If you must use `scanf()`, remember that the scan set [leaves a newline in the input](https://stackoverflow.com/questions/5240789/scanf-leaves-the-new-line-char-in-buffer); you have to read that before you can read the next line. Beware buffer overflow. Use `%63s` or `%63[^\n]` to read into a `char s[64];` variable. – Jonathan Leffler Nov 22 '19 at 14:01

1 Answers1

0

Use the standard C function fgets. For example

char s[N];
while ( fgets( s, sizeof( s ), stdin ) != NULL && s[0] != '\n' )
{
    //...
}

Where N is some integral value.

Here is a demonstrative program

#include <stdio.h>
#include <string.h>

int main(void) 
{
    enum { N = 100 };
    char s[N];

    while ( fgets( s, sizeof( s ), stdin ) != NULL && s[0] != '\n' )
    {
        s[ strcspn( s, "\n" ) ] = '\0';
        puts( s );
    }

    return 0;
}

if to enter

Car
Black car
White car

and after the last input press one more Enter then the output will be

Car
Black car
White car

This statement

s[ strcspn( s, "\n" ) ] = '\0';

is used to exclude the new line character '\n' from the entered string. This character can be appended to the entered string by the function fgets.

Vlad from Moscow
  • 301,070
  • 26
  • 186
  • 335