据我所知,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
为什么会这样?
缺少的是 for
循环在第一次进入时将 j
初始化为 0。
虽然 j
在声明时被初始化为 0,但是 while
循环是在另一个 while
循环中调用的,所以它不会得到每次都重新初始化。
添加初始化:
j=0;
while(tmp[j] != '\0'){
if(tmp[j] == str[i]){
found++;
}
j++;
}
你得到:
Before = Mississippi
After = Misp
我是一名优秀的程序员,十分优秀!