你好,堆栈溢出的好人。
解释
我正在努力做到以下几点。
我的程序需要以字母流作为输入,然后输出旋转13步。
例如
A变为N
B变为O
C变为P
D变为Q
等等
对于这个程序,我需要使用ascii表。因此,例如小写a = 97,一旦我的程序完成,它就变成n = 110
我为此写了一个小公式
c =(c + 13-97)%26 + 97其中c是我的信。你可以看到,如果c = 97,那么c将最终为110。
所以这是我的程序
如我所见,我使用if语句来判断我是否有大写或小写字母。
/* 97 is lower case a in ascii and 122 is lower case z*/
# include <stdio.h>
int main() {
char c;
printf("please enter a character:");
while (c!=-1) {
c=getchar();
putchar (c);
if ( c>=97 && c<=122) {
c=(c+13-97)% 26+97 ;
printf("%c \n " ,c);
}
else
c=(c+13-65) % 26 +65 ;
printf("%c \n " ,c);
}
return 0;
}
我的问题在于输出,例如,如果我插入
而不是我得到
an
n
1
答案 0 :(得分:2)
您的代码绝对没问题,但有一些细微的变化。
/* 97 is lower case a in ascii and 122 is lower case z*/
# include <stdio.h>
int main()
{
char c;
printf("please enter a character:");
while (c!=-1)
{
c=getchar();
//putchar (c); // Avoid Printing entered character
if ( c>=97 && c<=122)
{
c=((c+13-97)% 26)+97 ;
printf("%c \n " ,c);
}
else
{ // Braces missing
c=((c+13-65) % 26) +65 ;
printf("%c \n " ,c);
}
return 0;
}
}
输出:
please enter a character : a
n
答案 1 :(得分:0)
while
循环应为
while ((c=getchar()) != EOF)
您的代码在c
初始化之前检查c
的值。你应该对此发出警告。
您不应在代码中使用硬编码的ASCII值。小写字母a是'a'
。小写字母z是'z'
。所以,例如,你可以写
if ( c >= 'a' && c <= 'z' )
请注意stdin
缓冲字符,直到您按下return
键。当您按下return
键时,getchar
将为您提供键入的字符,后跟换行符'\n'
字符。您的代码只处理小写和大写字符。您需要修改代码以正确处理非字母字符,例如空格,标点符号,换行符。
答案 2 :(得分:0)
您将遇到的另一个问题是需要在读取下一个字符之前清除输入缓冲区中剩余的\ 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.