2015-12-02 4 views
0

Насколько я знаю, разница между for петлей и while циклом выглядит следующим образом:цикла 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(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 не инициализирует j=0 на каждой итерации самого внешнего цикла!

1

Обратите внимание, что петля while не инициализирует j до 0.

Удалить инициализацию j к 0 и добавить

j = 0; 

перед вашим вложенным while петли.

1

Вы никогда не сбрасываете j на 0 с циклом while.

Этот бит:

for(j=0; 
1

for loop

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

выше синтаксис производит код, эквивалентный:

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

За исключением того, что

  1. имен, объявленных Init-заявление (если INIT-заявление является декларация) и имена объявлены условия (если условие является декларация) находятся в том же объеме (что также область применения ).
  2. continue в заявлении будет выполнять iteration_expression
  3. Пусто условие эквивалентно while(true)
Смежные вопросы