0

我在搞乱下面的函数,我想在用户输入点字符时结束输入捕获。似乎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);     
        }
    }
}

更新

看来我还不够清楚。我想要做的是当用户输入一个点时它应该像按下 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自身期间读取并忽略它(而不是刷新缓冲区或执行 a getchar),只需将其添加到格式字符串的末尾即可。IE:

scanf ("%[^.].", chWord);
于 2012-12-20T12:29:39.230 回答
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;
}
于 2012-12-20T13:03:59.287 回答