无法用空格扫描字符串

时间:2016-05-20 06:08:05

标签: c arrays scanf

https://www.codechef.com/problems/LADDU 无法扫描数组中的字符串" work"在代码的第12行。

     #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;
    }

4 个答案:

答案 0 :(得分:2)

而不是"zone.js"使用scanf()来扫描带空格的字符串。

fgets()

注意: fgets(work,sizeof(work),stdin); 附带换行符。所以

fgets()

答案 1 :(得分:1)

使用fgets代替scanf。

#define BUFFERSIZE sizeof(work)

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

获取带空格的字符串。

如果你的C-stirng比BUFFERSIZE最后一个字符短,那么空终结符将为'\n'

答案 2 :(得分:0)

@RequestMapping(value = "/VMS-49001/playlist/{listName:.+}") public ResponseEntity<byte[]> testphoto() throws IOException { InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg"); final HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.parseMediaType("application/vnd.apple.mpegurl")); headers.setContentDispositionFormData(fileName, fileName); return new ResponseEntity<byte[]>(IOUtils.toByteArray(in), headers, HttpStatus.CREATED); }

执行该行后,换行仍然无法使用。

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

由于scanf("%[^\n]s",work);不接受换行符,因此不会执行读取。
(另外,%[^\n]不是必需的。例如s - &gt; %[^\n]s

所以,改变如下。

%[^\n] // scanf("%lld %s%*c",&actv,origin);用于跳过一个字符(换行符)或%*c //跳到换行符
...
while(getchar()!='\n');

答案 3 :(得分:0)

快速阅读/写入数字使用:

#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

除上述两个函数外,这是一个使用这些函数的典型程序:

#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;
}

fastRead和fastWrite函数(而不是printf和scanf)将大大加快代码的速度。

现在您只需要实现问题集。

注意:读一个字符串:

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

您可以使用其他字符串分隔符,例如'\ n',而不是''