我陷入了书中的问题。问题是 -
典型的互联网新手是一个名字B1FF,他有一种独特的编写消息的方式。这是典型的B1FF公报。
H3Y DUD3,C 15 R1LLY C00L
写一个“B1FF过滤器”,读取用户输入的消息并将其转换为B1FF-speak:
输入消息:嘿老兄,C很酷 在B1FF中说:H3Y DUD3,C 15 R1LLY C00L
您的程序应将消息转换为大写字母,替换某些字母的数字(A = 4,B = 8,E = 3,I = 1,O = 0,S = 5)。
我的计划 -
#include<stdio.h>
int main()
{
char arr[50]={0},ch[50]={0};
int i=0;
printf("\nenter the sentence : ");
while(arr[i-1]!='\n')
{
scanf("%c",&arr[i]);
i++;
}
i=0;
while(arr[i]!='\n')
{
if(arr[i]=='e')
ch[i]='3';
if(arr[i]==('A'||'a') )
ch[i]='4';
if(arr[i]==('B'||'b'))
ch[i]='8';
if(arr[i]==('I'||'i'))
ch[i]='1';
if(arr[i]==('o'||'O'))
ch[i]='0';
if(arr[i]==('S'||'s'))
ch[i]='5';
else ch[i]=arr[i]-32;
i++;
}
ch[i]='\n';
i=0;
printf("\nIn B1FF-SPEAK : ");
while(ch[i]!='\n')
{
printf("%c",ch[i]);
i++;
}
printf("\n");
return 0;
}
我不明白为什么程序没有转换字母表以及为什么scanf()
不接受space
作为字符?
答案 0 :(得分:5)
首先,您不能将逻辑OR运算符链接为
if(arr[i]==('A'||'a') )
并获得期待的内容,因为这会解决为始终为TRUE的情况。 [ ('A'||'a')
评估为TRUE ]
你必须使用
if ( (arr[i]=='A') || (arr[i] =='a'))
那就是说,
ch[i]=='8';
,ch[i]==1;
基本上是空语句。您正在比较并丢弃比较结果。如果您想要分配,则需要使用=
。
仅else ch[i]=arr[i]-32;
与之前的if
语句绑定,而不是整个if
链。您可以使用switch
案例或if-else if-else
构造来处理该部分。
你没有单独处理空格。
详细说明,由于上面的第二点,你的代码基本上缩减为
while(arr[i]!='\n')
{
if(arr[i]==('S'||'s')) //always false
ch[i]='5';
else ch[i]=arr[i]-32; //always TRUE
i++;
}
这只是将小写转换为UPPERCASE的不良尝试。如果字符串中存在非alpha输入,代码将会爆炸。
那说,关于
为什么
scanf()
不接受空格作为角色?
部分,scanf()
完全接受空格作为%c
的输入,您只需将其转换为NUL
(null
) 盲目从32
中space
减去NUL
。 <select name="quantity">
<option value="<?php echo $value1; ?>"><?php echo $value1; ?> for <?php echo $value2; ?>
</select>
不可打印,并且不会出现在输出中。
答案 1 :(得分:1)
一些建议:
不要使用很多小调用scanf("%c"...)
。使用fgets()
(manpage)。 fgets
从输入中读取整行,将其存储在缓冲区(包括换行符)中,并粘贴&#39; \ 0&#39;在它结尾的字节,所以你知道字符串有多长。
使用toupper()
(manpage)。它需要一个任意字符作为输入。如果输入是小写字母,则输出是该字母的大写版本。否则,输出与输入相同。
就地更新阵列。你不需要两个阵列。使用fgets()
读取数组,使用翻译逻辑循环播放数组,随时更新每个字符,然后使用fputs()
写出数组。
了解switch语句。 switch语句将使您的代码更紧凑,更易于阅读。每个字母 - &gt;数字转换需要一个案例,其他所有内容都需要默认情况。
c = toUpper(c);
switch (c) {
case 'A': c = '4'; break;
case 'B': c = '8'; break;
....
default: break;
}