问题描述
我的主要问题是我有两个字符串和一个要读取的浮点数。字符串的大小为 10 字节,但无论输入是什么,我都应该能够读取并将其存储在字符串中。
例如:
如果我的输入是 Hello World!
那么字符串应该是 string = "Hello wor"
如果我的输入是 Hello
那么字符串应该是 string = "Hello"
现在您可能认为这很明显,只需使用 fgets 对吗?但是在读取第二个字符串时会出现缓冲区问题。问题是,我确实找到了一个修复程序,但这涉及使用 fflush 函数,但它似乎在一些编译器中不起作用。
我搜索了替代方法并找到了 while ( getchar() != '\n')
,但它实际上不像 fflush 那样工作。
那么我在这里要问的是,无论输入的长度如何,都有更好的替代方法来读取字符串吗?这是我想出的:
#include <stdio.h>
#include <string.h>
int main(int argc,char** argv) {
char nom[10],prenom[10];
double salaire;
fgets( nom,sizeof( nom ),stdin );
nom[ strcspn( nom,"\n") ] = 0;
fflush(stdin);
fgets( prenom,sizeof( prenom ),stdin );
prenom[ strcspn( prenom,"\n") ] = 0;
fflush(stdin);
scanf("%lf",&salaire);
printf("%s\n",nom);
printf("%s\n",prenom);
printf("%lf\n",salaire);
return 0;
}
解决方法
如果您希望每个字符串都在自己的行上,您可以使用以下解决方案:
oscillator = new Tone.Oscillator(220,"sine");
var filter = new Tone.Filter(1200,"lowpass");
var vol = new Tone.Volume();
// Example of LFO for lowpass filter.
var lfo = new Tone.LFO(4,200,1200); // hertz,min,max
lfo.connect(filter.frequency);
lfo.start();
// Example of LFO for volume.
var lfo2 = new Tone.LFO(0.1,-100,0); // hertz,max
lfo2.connect(vol.volume);
lfo2.start();
oscillator.chain(filter,vol);
oscillator.start();
vol.toDestination();
,
在这种情况下,fgets
在读取输入时包含 '\n'
实际上很有用。如果字符串末尾有 \n
,则表示 fgets
能够读取整行直到结束。如果是其他字符,则表示 fgets
在到达行尾之前停止,并且未读取整行。我们可以使用它来使用 getchar()
循环来清除 stdin
仅当整行都没有被读取时。
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[10],str2[10];
fgets(str1,sizeof str1,stdin);
if (str1[strlen(str1) - 1] != '\n')
for (int c; (c = getchar()) != '\n' && c != EOF;);
fgets(str2,sizeof str2,stdin);
if (str1[strlen(str1) - 1] != '\n')
for (int c; (c = getchar()) != '\n' && c != EOF;);
// Now it's safe to remove the \n
str1[strcspn(str1,"\n")] = '\0';
str2[strcspn(str2,"\n")] = '\0';
printf("%s\n%s\n",str1,str2);
}
您甚至可以在 fgets
周围制作一个简单的包装器,以便在您阅读一行时执行此操作:
char *readln_and_clear(char *buf,size_t bufsz,FILE *stream)
{
if (fgets(buf,bufsz,stream) == NULL)
return NULL;
if (buf[strlen(buf) - 1] != '\n')
for (int c; (c = fgetc(stream)) != '\n' && c != EOF;);
// If you want
buf[strcspn(buf,"\n")] = '\0';
return buf;
}