简体   繁体   中英

not able to scan the string with spaces

https://www.codechef.com/problems/LADDU not able to scan string in the array "work" on line 12 of the code.

     #include<stdio.h>

     int main()
     {
        long long int i,j,T,actv,points,a,b,c;
        char origin[100],work[100];
        scanf("%lld",&T);
        while(T--)
        {
            points=0;
            scanf("%lld %s",&actv,origin);
            for(i=0;i<actv;i++)
            {
                    printf("hie\n");
                    scanf("%[^\n]s",work);
                    printf("hello\n");
            }
       }

       return 0;
    }

Instead of scanf() use fgets() to scan a string with spaces.

fgets(work,sizeof(work),stdin);

Note: fgets() comes with a newline character. So

size_t n = strlen(work);
if(n>0 && work[n-1] == '\n')
{
   work[n-1] = '\0';
}

Use fgets instead of scanf.

#define BUFFERSIZE sizeof(work)

if (fgets(work, BUFFERSIZE , stdin) != NULL)
{
   // your stuff
}

To get your string with spaces.

If your C-stirng is shorter than BUFFERSIZE last char before null terminator will be ' \\n'

scanf("%lld %s",&actv,origin);

After the line is executed, newline remains unconsumed.

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

Since %[^\\n] doesn't accept the newline, it doesn't perform read.
(Also, s is not required. Eg %[^\\n]s --> %[^\\n] )

So, Change such in the following.

scanf("%lld %s%*c",&actv,origin); // %*c for skip one character(newline) or while(getchar()!='\\n'); //skip upto newline
...
scanf("%99[^\\n]%*c",work);

for fast reading/writing of numbers use:

#include <stdio.h>

void fastRead( size_t *a );
void fastWrite( size_t a );

inline void fastRead(size_t *a)
{
    int c=0;
    // note: 32 is space character
    // consume leading trash
    while (c<33) c=getchar_unlocked();

    // initialize result value
    *a=0;

    // punctuation parens, etc are show stoppers
    while (c>47 && c <58)
    { // then in range 0...9
        *a = (*a)*10 + (size_t)(c-48);
        c=getchar_unlocked();
    }
    //printf( "%s, value: %lu\n", __func__, *a );
} // end function: fastRead


inline void fastWrite(size_t a)
{
    char snum[20];
    //printf( "%s, %lu\n", __func__, a );

    int i=0;
    // decompose 'a' into char array
    do
    {
        // 48 is numeric character 0
        snum[i++] = (char)((a%10)+(size_t)48);
        a=a/10;
    }while(a>0);

    i=i-1; // correction for overincrement from prior 'while' loop

    while(i>=0)
    {
        putchar_unlocked(snum[i--]);
    }
    putchar_unlocked('\n');
} // end function: fastWrite

Along with the above two functions, here is a typical program using those functions:

#define MAX_VALUE (1000000)

int array[ MAX_VALUE +1 ];

int main( void )
{
    // get number of test cases
    size_t  numTestCases;
    fastRead( &numTestCase );
    //scanf( "%lu", &numTestCases );
    //printf( "%s, Number of Test Cases: %lu\n", __func__, numTestCases);

    // accumulate test cases, sorted
    for( size_t i=0; i<numTestCases; i++ )
    {
        size_t value;
        fastRead( &value );
        //scanf( "%lu", &value );
        array[value]++;
    }

    // output the unique values, assending
    for( size_t i=0; i<MAX_VALUE; i++ )
    {
        if( array[i] )
        {
            fastWrite( i );
            //printf( "%s. %lu\n", __func__, i );
        }
    }


    return 0;
}

The fastRead and fastWrite functions (rather than printf and scanf) will greatly speed up your code.

Now you only need to implement the problem set.

Note: to read in a string:

size_t i = 0;
while( i < sizeof( inputArray ) && (ch = getchar_unlocked()) && ' ' != ch )
{
    inputArray[i] = ch;
    i++;
}
inputArray[i] = '\0';

You could use some other string delimiter, like a '\\n', rather than ' '

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM