WHILE循环显示与FOR循环不同的输出

时间:2015-12-02 19:33:03

标签: c for-loop while-loop

据我所知,for循环和while循环之间的区别如下:

作为

首先进行初始化,然后检查条件表达式,如果它导致TRUE,那么只有语句部分被执行,这个循环是连续的,直到条件表达式结果为FALSE

虽然:

首先检查条件表达式,如果结果为TRUE,则语句部分执行,否则不执行,此循环是连续的,直到条件表达式结果为FALSE

今天我编写了一个算法,用于检查string是否有重复项,如果是,则只打印那些不重复的算法:

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

int main(void){
    const char *str = "Mississippi";
    char tmp[15] = {0};
    size_t i=0,j=0,k=1;
    int found=0;

    tmp[0] = str[0];

    printf("Before = %s\n",str);
    while(str[i] != '\0'){
        for(j=0;tmp[j] != '\0';j++){
            if(tmp[j] == str[i]){
                found++;
            }
        }

        if(found==0){
            tmp[k]=str[i];
            k++;
        }

        found=0;
        i++;
    }

    tmp[strlen(tmp)] = '\0';
    printf("After  = %s\n",tmp);
    return 0;
}

输出:

Before = Mississippi
After  = Misp

现在看看如果替换for循环会发生什么:

for(j=0;tmp[j] != '\0';j++){
    if(tmp[j] == str[i]){
        found++;
    }
}

使用`while循环:

while(tmp[j] != '\0'){
    if(tmp[j] == str[i]){
        found++;
    }
    j++;
}

我明白了:

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

int main(void){
    const char *str = "Mississippi";
    char tmp[15] = {0};
    size_t i=0,j=0,k=1;
    int found=0;

    tmp[0] = str[0];

    printf("Before = %s\n",str);
    while(str[i] != '\0'){
        while(tmp[j] != '\0'){
            if(tmp[j] == str[i]){
                found++;
            }
            j++;
        }

        if(found==0){
            tmp[k]=str[i];
            k++;
        }

        found=0;
        i++;
    }

    tmp[strlen(tmp)] = '\0';
    printf("After  = %s\n",tmp);
    return 0;
}

但输出并不像预期的那样:

Before = Mississippi
After  = Misp

可是:

Before = Mississippi
After  = Misisipi

为什么会这样?

5 个答案:

答案 0 :(得分:2)

缺少的是for循环首次进入时将j初始化为0。

虽然j在声明时被初始化为0,但while循环在另一个while循环中被调用,因此每次都不会重新初始化。

添加初始化:

    j=0;
    while(tmp[j] != '\0'){
        if(tmp[j] == str[i]){
            found++;
        }
        j++;
    }

你得到:

Before = Mississippi
After  = Misp

答案 1 :(得分:1)

因为while循环在最外层while循环的每次迭代时都没有初始化j=0

答案 2 :(得分:1)

请注意,while循环不会将j初始化为0

j的初始化移至0并添加

j = 0;

在嵌套的while循环前面。

答案 3 :(得分:1)

您永远不会使用while循环将j重置为0.

这一位:

for(j=0;

答案 4 :(得分:1)

for loop

for ( init-statement(optional) ; condition(optional) ;
      iteration_expression(optional) )
  statement
     

上述语法产生的代码相当于:

{
  init_statement 
  while ( condition ) { 
    statement 
    iteration_expression ; 
  }
}
     

除了

     
      
  1. init-statement声明的名称(如果init-statement是声明)和由condition声明的名称(如果condition是a   声明)在同一范围内(也是范围)   语句)。
  2.   语句中的
  3. continue将执行iteration_expression
  4.   
  5. 空条件相当于while(true)
  6.   
相关问题