2015-12-02 249 views
0

不同的输出据我所知for环和while循环之间的差别看起来是这样的:WHILE循环显示出比FOR循环

为:

拳头初始化时则条件表达式检查如果结果为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 

为什么会发生这种情况?

+2

TLDR;请提供一个简短而亲切的[MCVE](http://stackoverflow.com/help/mcve)来说明问题。不要发布有效的代码。 –

+0

@WeatherVane对不起,用示例去掉了部件。 – Michi

+0

Down Voter请解释一下,为什么?有没有机会看到谁投下了我的票? – Michi

回答

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 
+0

哦,我很傻。谢谢。 – Michi

1

因为while循环在最外while循环的每次迭代中不初始化j=0

1

请注意,while循环不会初始化j0

删除的j的初始化0并在嵌套循环while前面加

j = 0; 

1

您不会使用while循环将j重置为0。

该位:

for(j=0; 
1

for loop

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

上述语法生成的代码等同于:

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

除了由init声明宣称

  1. 名称(如果初始化语句是一个声明)和条件声明的名称(如果条件是 声明)是在相同的范围(这是声明的范围也是 )。
  2. 的语句将执行iteration_expression
  3. 空状态continue相当于while(true)