【发布时间】:2015-12-02 19:33:03
【问题描述】:
据我所知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
为什么会这样?
【问题讨论】:
-
TLDR;请提供一个简短而甜蜜的MCVE 来说明问题。不要发布有效的代码。
-
@WeatherVane 抱歉,删除了示例中的部分。
-
反对票 请解释一下,为什么?有没有机会看看谁投了我的票?
-
将我标记为我的评论在上面-但这不是我的反对意见。
-
我真的需要知道,这个问题有什么问题。这不对,这里发生了什么。
标签: c for-loop while-loop