【问题标题】:uppercase Letter count, lowercase letter count, blank count, and lower to upper conversion- C大写字母计数、小写字母计数、空白计数和小写到大写转换 - C
【发布时间】:2012-01-26 11:21:26
【问题描述】:

我对语言 (C) 有点陌生,但我想做的是非常简单的 imo。我确定我只是忽略了某些事情或遇到了一些逻辑错误。

正如标题所示,我希望我的程序做的只是计算小写字母、大写字母和空格的数量。作为附加功能,它还将输入的小写字母转换为大写。

#include <stdio.h>

int main(void){

    int iochar, numdigits=0, numlower=0, numupper=0, numwhites=0;

    printf("Please enter a phrase:\n\n");

    while((iochar=getchar())!=EOF) {
        if ((iochar=' ')||(iochar='\t')||(iochar='\n')){
            numwhites++;
            putchar(iochar);
        }
        else if((iochar>='0')&&(iochar<='9')) {
         numdigits++;
         putchar(iochar);
        }
        else if(('a'<=iochar)&&(iochar<='z')) {
            numlower++;
            putchar(iochar-32);
        } 
        else if(('A'<=iochar)&&(iochar<='Z')) {
            numupper++;
            putchar(iochar);
        }
        else 
           putchar(iochar); 
    }

    printf("%d white characters, %d digits, ",numwhites,numdigits);
    printf("%d lowercase have been converted to ",numlower);
    printf("uppercase and %d uppercase.\n",numupper);

    printf("\n\n");

    return 0;
}

【问题讨论】:

  • 好。问题是什么?
  • 如果您在编码时错过区分 = 和 == ,请在比较时保持左侧的常量。例如如果 (' ' == iochar) 。这样可以避免犯错。
  • @yadab:当比较的两边都是左值时如何避免错误?
  • @SteveJessop:我不知道!但这是用于将常量与左值进行比较。

标签: c counter uppercase lowercase


【解决方案1】:
if ((iochar=' ')||(iochar='\t')||(iochar='\n'))

在此您分配给 iochar 并且将始终为真。应该是比较:

if ((iochar==' ')||(iochar=='\t')||(iochar=='\n'))

【讨论】:

    【解决方案2】:

    请查看在ctype.h 中定义的isupper(int c)islower(int c)isspace(int c)。您也许还可以从同一文件中定义的toupper(int c)tolower(int c) 中受益。

    还要注意 Sani 的回答,C 中的比较是 ==,而赋值是 =。此外,可以在if 语句中进行赋值,这可能会导致像您这样的错误,甚至是常见错误。在我看来,一个好的约定是这样写比较:

    if ('\n' == iochar)
    

    这样,如果我打错字并改写:

    if ('\n' = iochar)
    

    我会在编译期间遇到语法错误,而在运行时不会出现奇怪的行为。

    【讨论】:

    • 另一种方法是使用一个编译器,它会警告if (iochar = '\n'),然后以您认为更清晰的方式编写。风险在于虚假警告,尤其是在您未编写且不想修改以抑制警告的代码中。
    • @Steve:在这种情况下,gcc 所做的是要求您将分配包装在括号中以抑制警告。所以如果你真的想要分配,你写if ((iochar = '\n'))。一个常见的习惯用法在ifs 中为malloc(2) 使用这种分配方式:if (!(p = malloc(sizeof(*p)))) { ... }
    • 确实如此,这就是为什么如果有人写了if (c = *str++),您可能不想为了抑制警告而将其代码更改为if ((c = *str++))。但在新代码中一切正常。
    • 感谢您的意见,尽管它提出了另一个问题!请帮我解答我的第二个问题stackoverflow.com/questions/9017744/…
    【解决方案3】:

    我认为 Sani Huttenen 很好地解决了您的问题。我还建议您致电

    putchar(iochar)
    

    只在你的袖口末端一次...这样会更清楚。

    【讨论】:

      猜你喜欢
      • 2016-03-11
      • 1970-01-01
      • 2013-02-04
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-28
      • 1970-01-01
      相关资源
      最近更新 更多