3

私はCでのプログラミングを始めたばかりで、暗号/暗号化プログラムを書いています。ユーザーは、char*として保存されているフレーズを入力するように求められます。問題は、プログラムが文字列の最初の単語のみを格納し、その後のすべてを無視することです。文字列をフェッチして分析するコードの部分は次のとおりです

int maincalc(int k)                         //The Calculation Function for Cyphering
{
    char *s;
    s=(char*) malloc(sizeof(100));
    printf("Please enter the phrase that you would like to code: ");  
    fscanf(stdin,"%s %99[^\n]", s);
    int i=0;
    int n=strlen(s);

    while(i<n)
    {
        if(s[i]>=65&&s[i]<=90)              //For Uppercase letters
        {
            int u=s[i];
            int c=uppercalc(u,k);
            printf("%c",c);
        }
        else if(s[i]>=97&&s[i]<=122)    //For Lowercase letters
        {
            int u=s[i];
            int c=lowercalc(u,k);
            printf("%c",c);
        }
        else 
            printf("%c",s[i]);          //For non letters
        i++;
    }
    free(s);
    printf("\n");
    return 0;
} 

プログラムに最初の単語だけでなく文字列全体の存在を認識させるために何をすべきかを知る必要があります。ありがとう

4

1 に答える 1

2

いいえ、どちらも機能しません。fscanfを使用しても、ユーザー入力を待機しません。単に「フレーズを入力してください...」と出力してから終了します。fgetsも同じことを行い、プログラムは入力を待たずに「PLeaseenter...」と出力して終了します。

そのコメントでは、編集の前に、以前の入力について言及しました。私の超能力者は、前の入力からの改行がまだ入力バッファーにあることを教えてくれます。それは

fgets(s, 100, stdin);

fscanf(stdin, "%99[^\n]", s);

入力の終了を通知する改行にすぐに遭遇するため、すぐに戻ります。

より多くの文字列入力を取得する前に、バッファから改行を消費する必要があります。あなたが使うことができます

fscanf(stdin, " %99[^\n]", s);

フォーマットの先頭のスペースは、入力バッファーの最初の空白を消費するか、入力バッファーをクリアします

int ch;
while((ch = getchar()) != EOF && ch != '\n);
if (ch == EOF) {
    // input stream broken?
    exit(EXIT_FAILURE);
}

fgetsまたはのいずれかで入力を取得する前fscanf

于 2013-03-02T14:06:54.777 に答える