您将遇到的另一个问题是需要在读取下一个字符之前刷新输入缓冲区中剩余的\ n。基本上,输入字符后用户按下Enter
,c
是从输入缓冲器中读取的,但'\n'
仍然存在。因此,下一次输入循环时,\n
已经存在于输入缓冲区中,并在该迭代中被视为c
。
为了防止这种情况发生,到flush
输入缓冲器中的最简单的方法是定义一个扔掉的int
说int flush
和之后的字符的每个读取,增加以下内容:
do { flush=getchar(); } while (flush != '\n');
这将解全部来自input buffer
的其余字符准备下一次阅读。 (注:fflush
不这样做对于输入流)与此结合的实现是:
#include <stdio.h>
int main() {
int c = 0; /* Always initialize variables */
int flush = 0;
int new = 0;
printf ("\nPlease enter a character (ctrl+d to exit):\n\n");
while (printf (" char: ") && (c = getchar()) != -1) {
do { flush=getchar(); } while (flush != '\n'); /* flush input buffer */
if (c >= 'a' && c <= 'z')
{
new = (c + 13 - 97) % 26 + 97;
printf ("\t lower-case '%c' becomes: '%c'\n\n", c, new);
}
else if (c >= 'A' && c <= 'Z')
{
new = (c + 13 - 65) % 26 + 65;
printf ("\t upper-case '%c' becomes: '%c'\n\n", c, new);
}
else
{
printf ("\n invalid character, try again\n\n");
}
}
printf ("\n\nexiting.\n\n");
return 0;
}
输出:
Please enter a character (ctrl+d to exit):
char: a
lower-case 'a' becomes: 'n'
char: b
lower-case 'b' becomes: 'o'
char: n
lower-case 'n' becomes: 'a'
char: o
lower-case 'o' becomes: 'b'
char: A
upper-case 'A' becomes: 'N'
char: B
upper-case 'B' becomes: 'O'
char: N
upper-case 'N' becomes: 'A'
char: O
upper-case 'O' becomes: 'B'
char:
exiting.
祝你好运与您的项目。如果遇到其他问题,请留言。
多个字符版本使用函数getline
关于你提到的有关线路输入问题。下面是一个使用getline
从stdin
读取多个字符的版本:
#include <stdio.h>
int main() {
int new = 0;
ssize_t nread = 0; /* number of chars read by getline */
char *line = NULL; /* string holding chars - getline allocates when NULL */
size_t n = 0; /* limit number of bytes to (ignored when 0) */
char *p = NULL; /* point to use to iterate over each char in line */
int index = 0; /* simple index for formatted output. */
printf ("\nPlease enter characters to translate (ctrl+d to exit):\n");
while (printf ("\n input: ") && (nread = getline (&line, &n, stdin) != -1)) {
index = 0; /* reset index */
p = line; /* assign pointer to line */
printf ("\n"); /* just because it looks nice */
while (*p != '\n') /* getline consumes the '\n' */
{
if (*p >= 'a' && *p <= 'z')
{
new = (*p + 13 - 97) % 26 + 97;
printf ("\t char[%2d] : %c => %c\n", index, *p, new);
}
else if (*p >= 'A' && *p <= 'Z')
{
new = (*p + 13 - 65) % 26 + 65;
printf ("\t char[%2d] : %c => %c\n", index, *p, new);
}
else
{
printf ("\n char[%2d] : %c => invalid character\n", index, *p);
}
p++;
index++;
}
}
printf ("\n\nexiting.\n\n");
return 0;
}
输出:
Please enter characters to translate (ctrl+d to exit):
input: aAbBcCmMnNoO
char[ 0] : a => n
char[ 1] : A => N
char[ 2] : b => o
char[ 3] : B => O
char[ 4] : c => p
char[ 5] : C => P
char[ 6] : m => z
char[ 7] : M => Z
char[ 8] : n => a
char[ 9] : N => A
char[10] : o => b
char[11] : O => B
input:
exiting.
使用'{}'为其他块。并替换'else if('A'<= c && c <='Z')'也可以'char c;' - >'int c;' – BLUEPIXY 2014-10-19 18:23:42