在 C 中读取多个字符串并浮动多个案例

问题描述

我的主要问题是我有两个字符串和一个要读取的浮点数。字符串的大小为 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;
}