【问题标题】:pig latin in c++, some bugs for "flower" and "rhythm"c++中的猪拉丁文,“花”和“节奏”的一些错误
【发布时间】:2017-05-06 09:17:57
【问题描述】:

我的代码工作正常,除了“花”和“节奏”。输出结果是这样的:“Owerfiay”,“Ythrmreay”;其中“i”和“e”分别是 i-cap 和 e-cap。我尝试检查 ASCII 表以防我在某个地方出错,但我在表中找不到这两个。我的 C++ 知识有限,所以当我尝试阅读这里和其他任何地方的一些现有线程时,我跟不上它们。

这是我的代码:

#include <stdio.h>
#include <string.h>

void toPigLatin(char *i){
    int k,m;
    char *n;
    n = i;
    printf("Pig Latin version: ");
    if(*i=='A'||*i=='a'||*i=='E'||*i=='e'||*i=='I'||*i=='i'||
           *i=='O'||*i=='o'||*i=='U'||*i=='u'){
        k = 0;
        while(*i!='\n'){
            printf("%c",*i);
            i++;
            k++;
        }
        printf("way");
    }else{
        k = 1;
        i++;
        while(*i!='\0'){
            if(*i=='A'||*i=='a'||*i=='E'||*i=='e'||*i=='I'||*i=='i'||
                *i=='O'||*i=='o'||*i=='U'||*i=='u'||*i=='Y'||*i=='y'){
                break;
            }
            k++;
            i++;
        }
        i = n + k;
        char *r;
        r = n;
        while(*i!='\0'){
            if(*n>=65&&*n<=90)
                printf("%c",*i-32);
            else
                printf("%c",*i);
            i++;
            n++;
        }
        i = r;
        m = 0;
        while (m!=k){
            if(*r>=65&&*r<=90)
                printf("%c",*i+32);
            else
                printf("%c",*i);
            m++;
            i++;
        }
        printf("ay");
    }
}

int main(){
    char arr[16],*i,check[16];
    i = check;
    printf("Enter a word: ");
    scanf("%s",arr);
    while(1){
        strcpy(check,arr);
        if(strcmp(check,"exit")==0){
            break;
        }
        else{
            printf("\n\n");
            toPigLatin(arr);
            printf("\n\nEnter a word: ");
            scanf(" %s",arr);
        }
    }
    return 0;
}

【问题讨论】:

  • ASCII码65和90对应AZ,所以你可以把你的条件写成if ( *r &gt;= 'A' &amp;&amp; *r &lt;= 'Z' )。您的代码是纯 C 语言,顺便说一句。
  • 在 2017 年,这段代码看起来很奇怪,就像试图通过摩擦着火......
  • 你应该给出一个系统工作的单词列表,以及系统不能工作的两个单词列表。另外,请解释“其中“i”和“e”分别是 i-cap 和 e-cap 的含义。
  • @Bob__ -- 使用isupper,而不是建立对ASCII的依赖;它适用于系统正在使用的字符编码。

标签: c++ apache-pig flower


【解决方案1】:
if(*r>=65&&*r<=90)
    printf("%c",*i+32);

这应该检查*i,而不是*r

*r是用户单词的第一个字母,分别是F和R。由于 first 字母是大写字母,因此您的代码正在尝试将 current 字母从大写转换为小写。

您的程序需要检查当前字母而不是第一个字母。

不过,也就是说,有一种更简单的方法可以将字母转换为小写。你可以只使用&lt;ctype.h&gt;中的tolower

printf("%c", tolower(*i));

即使字母已经是小写字母也可以使用(它不会更改小写字母)。

【讨论】:

  • 谢谢。我又看了一遍,我在 while 循环中添加了 r++。现在已经修好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多