[英]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. 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;
}
Instead of scanf()
use fgets()
to scan a string with spaces. 代替
scanf()
使用fgets()
扫描带空格的字符串。
fgets(work,sizeof(work),stdin);
Note: fgets()
comes with a newline character. 注意:
fgets()
带有换行符。 So 所以
size_t n = strlen(work);
if(n>0 && work[n-1] == '\n')
{
work[n-1] = '\0';
}
Use fgets instead of scanf. 使用fgets代替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'
如果您的C-stirng小于
BUFFERSIZE
,则空终止符前的最后一个字符为' \\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. 由于
%[^\\n]
不接受换行符,因此不会执行读取。
(Also, s
is not required. Eg %[^\\n]s
--> %[^\\n]
) (也不需要
s
。例如%[^\\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');
//
%*c
跳过一个字符(换行符)或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. fastRead和fastWrite函数(而不是printf和scanf)将大大加快代码的速度。
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 ' ' 您可以使用其他一些字符串定界符,例如'\\ n',而不是''
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.