据我所知,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
为什么会这样?
答案 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 ( init-statement(optional) ; condition(optional) ; iteration_expression(optional) ) statement
上述语法产生的代码相当于:
{ init_statement while ( condition ) { statement iteration_expression ; } }
除了
- init-statement声明的名称(如果init-statement是声明)和由condition声明的名称(如果condition是a 声明)在同一范围内(也是范围) 语句)。
语句中的continue
将执行iteration_expression- 空条件相当于
醇>while(true)