您將遇到的另一個問題是需要在讀取下一個字符之前刷新輸入緩衝區中剩餘的\ 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