在循环

时间:2015-10-12 14:41:34

标签: c

我是C语言的新手,已经在这里做了一个小时,但我发现了循环迭代的奇怪行为 这段代码

int main(int argc, char** argv)
{
    int c;
    int big;
    int small;
    while(c=getchar())
    {
        if(c>='A' && c<='Z');
        big++;
        printf("%d",big);
    }
    printf("end");
}
只要有大写字符,

应该增加int。但它总是打印像5452之类的大数字等等,我是否想念c语言中的迭代或我的简单代码中有错误?

4 个答案:

答案 0 :(得分:5)

你有垃圾分号,big++被执行,无论c>='A' && c<='Z'如何 您还必须初始化big

此外,此代码取决于字符代码,因此如果未被禁止,则应使用isupper

#include <stdio.h>
#include <ctype.h>

int main(int argc, char** argv) {
    int c;
    int big = 0;
    int small;
    while(c=getchar()){ /* this loop should go infinitely in most case : compare with EOF to detect the end of input */
        if(isupper(c))
            big++;
        printf("%d",big); /* maybe you want to print newline after this */
    }
    printf("end");
    return 0;
}

答案 1 :(得分:4)

int big;

big刚刚声明不是初始化,因此给出了垃圾值。

int big=0;     // also initialize small 

会工作。

并且

  if(c>='A' && c<='Z');
                      ^ will terminate if statement then and there 

即使;条件为bigif false也将被提升。;之后删除if

答案 2 :(得分:4)

在您的情况下,您需要将big和其他变量初始化为0:

int c = 0;
int big = 0;
int small = 0;

否则这些变量将包含&#34; random&#34;值。这是一种未定义的行为,您将在C / C ++中遇到很多。

您的代码中的这些行也可能没有达到预期的效果

if(c>='A' && c<='Z');
    big++;

if的末尾有一个空语句。删除分号:

if(c>='A' && c<='Z')
    big++;

另一个问题是在while循环中打印很大。 getchar()将返回您键入的任何字符,包括空格。每次键入字符时都会执行printf("%d",big);,而不是每次键入大写字母或非空格字符时都会执行if (!isspace(c)) { printf("%d", big); } 。因此,如果您输入&#34; A A&#34;你会得到&#34; 112&#34;有几种方法可以对此进行排序。一个解决方案:

 function path(p) {
       if (p) {
          _path = p;
          return p;
       } else {
          return _path;
       }
    }

答案 3 :(得分:2)

你必须用0来初始化变量big。

int big = 0;