2016-05-20 1 views
2

https://www.codechef.com/problems/LADDU コードの12行目の配列 "work"で文字列をスキャンできません。スペースで文字列をスキャンできません

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

'のscanf("%の[^ \ n個]); ' - >' scanf( "%99 [^ \ n]%* c"、work); ' – BLUEPIXY

+0

このコーデックの問題のスピードは強く考慮する必要があります。 (1秒未満)出力は、(テストケースごとに)単一の数字で、その後に改行(およびプログラムの最後に改行が続きます。投稿コード1)は問題のセットを実装しません。 2)正しい値も正しい形式も出力されません。3)は異なる 'アクティビティ'を許さない4)負の値は含まれていないので、すべての変数は問題集合ごとに 'int' – user3629249

+0

ではなく' size_t'である可能性があります。 – user3629249

答えて

2

代わりのscanf()スペースで文字列をスキャンするfgets()を使用しています。

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

注: fgets()は、改行文字が付いています。したがって

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

scanfの代わりにfgetsを使用してください。

#define BUFFERSIZE sizeof(work) 

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

文字列をスペースで取得します。

ヌルターミネータは、行が実行された後、改行が消費されないまま\n'

0

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

"になる前に、C-stirngはBUFFERSIZE最後の文字より短い場合。

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

%[^\n]は改行を受け入れていないので、それは読んで実行されません。だから、

、以下の変更は、そのような -
(>%[^\n]また、sが必要とされていない、例えば%[^\n]sを。)。改行
件までスキップ// 1つの文字(改行)またはwhile(getchar()!='\n');をスキップするために

scanf("%lld %s%*c",&actv,origin); // %*c ...数字の高速な読み出し/書き込みのため
scanf("%99[^\n]%*c",work);

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 

上記の2つの機能に加えて、これらの機能を使用する典型的なプログラムを次に示します。

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

(printfとscanfではなく)fastRead関数とfastWrite関数は、コードを大幅に高速化します。

これで、問題セットを実装するだけで済みます。

注:文字列を読み込むために:あなたは同じように、他のいくつかのストリング区切り文字を使用することができ

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

を '\ n' のではなく、 ''

関連する問題