我陷入了一个书中给出的问题。问题是-
典型的网络新手是一个叫B1FF的家伙,他有一种独特的方式来传达信息
H3Y哑光,C 15 R1LLY C00L
编写“B1FF filter”,读取用户输入的消息并将其转换为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;
}

程序输出-
c - 为什么程序会产生意外的输出?-LMLPHP
我不明白为什么程序不转换字母,为什么scanf()不接受space作为字符?

最佳答案

首先,你不能像

  if(arr[i]==('A'||'a') )

得到你所期望的,因为这将归结为一个永远真实的条件。[('A'||'a')计算结果为TRUE]
你必须使用
  if ( (arr[i]=='A') || (arr[i] =='a'))

也就是说,
ch[i]=='8';ch[i]==1;基本上是空语句。您正在比较并丢弃比较结果。如果你想分配任务,你需要使用=
else ch[i]=arr[i]-32;只与前面的if语句绑定,而不与整个if链绑定。您可以使用switchcase或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++;
 }

这只是把小写字母转换成大写字母的一个错误尝试。如果字符串中有非alpha输入,则代码将爆炸。
也就是说,关于
为什么scanf()不接受空格作为字符?
部分,scanf()完全接受一个空格作为%c的输入,你只是通过盲目地从NUL中减去null来转换它而不是32space)。ANUL是不可打印的,不出现在输出中。

关于c - 为什么程序会产生意外的输出?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39532817/

10-11 23:14
查看更多