0

以下の関数をいじっています。ユーザーが DOT 文字を入力したときに入力キャプチャを終了したいです。getche()意図したことをしていないようです:

void Encode(FILE *fp)
{
    char chWord[100]; 
    char *chP;

    printf("Enter a word or a sentence, close it by a \".\"\r\n");
    scanf("%s",chWord);

    if (chWord != '.')
    {
        for (chP = chWord; *chP != '\0'; chP++) //to print each digit till end of string \0
        {
            printf("%d ",*chP+10);
            fprintf(fp, "%d ",*chP+10);     
        }
    }
}

アップデート

私は十分に明確ではなかったようです。私がやろうとしているのは、ユーザーが DOT を入力すると、ENTER キーを押すように動作して、プログラムが次のステップに進むことです。ある種のシミュレートする ENTER キー。

4

3 に答える 3

3
 if (chWord != '.')

する必要があります

 if (*chWord != '.')

char を別の char と比較するのではなく、char ポインターと char を比較しています。

このコードの書き方では、入力 ".123" が印刷セグメントをスキップすることに注意してください。これがあなたにとって望ましいかどうかはわかりません。

于 2012-12-20T12:29:28.807 に答える
3

関数のscanfファミリは、(負の) 文字セットを書式指定子として受け入れます。

scanf("%[abc]", chWord);文字 abc で構成される文字列のみを受け入れるようにすることができます。

また、受け入れない文字を指定することもできます。したがって、ドット以外scanf ("%[^.]", chWord);で構成される文字列を受け入れます。

編集

ドットが入力ストリーム バッファーに残ることを忘れていたので、scanfそれ自体を読み取って無視するには (バッファーをフラッシュしたりgetchar. すなわち:

scanf ("%[^.].", chWord);
于 2012-12-20T12:29:39.230 に答える
1

OK、更新に基づいて回答全体を取り消します...

答えはnoです。scanf でやりたいことを行う方法はありません。また、標準 C で何かを行う方法もありません。あなたがやろうとしていることは、プラットフォーム(およびおそらくコンパイラ)固有です。

をエンターキープレスとして扱いたい場合'.'は、自分で魔法をかける必要があります。特定の OS やコンパイラを使用しているかどうかについては触れていないので、最初に思いつく例を挙げます。

これは、Windows MS VS で動作します。

#include <Windows.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char key = 0;
    int counter = 0;
    char chWord[100] = {0};
    while(counter < 100) {
       while(!_kbhit()) {    //While no key has been hit
           Sleep(1);         //Sleep for 1 ms
       }
       key = _getch();       //Get the value of the key that was hit
       if(key == '.')        //if it was a .
         break;              //act as if it were an "enter" key and leave
       else
         chWord[counter] = key;
       counter++;
    }
    chWord[99] = '\0';
    printf("The string was %s\n", chWord);
    return 0;
}
于 2012-12-20T13:03:59.287 に答える