当用户输入“。”时停止`scanf`点

时间:2012-12-20 12:25:02

标签: c scanf getch

我正在搞乱下面的功能,我想在用户输入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键。

3 个答案:

答案 0 :(得分:3)

 if (chWord != '.')

应该是

 if (*chWord != '.')

您正在将char指针与char进行比较,而不是将char与另一个char进行比较。

请注意,此代码的写入方式输入“.123”将跳过打印段。不确定这是否适合你。

答案 1 :(得分:3)

scanf函数族接受(负)字符集作为格式说明符。

您可以scanf("%[abc]", chWord);只接受由字母abc组成的字符串。

您还可以指定接受哪些字符。因此scanf ("%[^.]", chWord);将接受由除了点之外的任何内容组成的字符串。

修改

我忘了提到,点将保留在输入流缓冲区中,所以要在scanf本身期间读取并忽略它(而不是刷新缓冲区或执行getchar),将其添加到格式字符串的末尾。即:

scanf ("%[^.].", chWord);

答案 2 :(得分:1)

好的,根据您的更新退出整个答案......

答案是没有,没有办法用scanf或者标准C中的任何内容做你想做的事情。你要做的是具体的平台(也可能是编译器)。

如果你想将'.'视为输入键,那么你必须自己做魔术。所以,既然你没有提到你是否使用任何特定的操作系统或编译器,我会给你第一个想到的例子。

适用于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;
}