【问题标题】:Why does my program work woth a for but now with a while loop?为什么我的程序可以使用 for 但现在使用 while 循环?
【发布时间】:2019-11-16 15:38:42
【问题描述】:

我很困惑,因为我刚刚花了一些时间来调试我的程序,最终可以通过将我的 while 循环换成 for 循环来适应它。以下代码可以正常工作并输出我输入的单词:

int status = 1;
int *ptrStatus = &status;
int no_words;
int random;
char *selected;


printf("Enter the no of words you want to enter.\n");
scanf("%d", &no_words);


// Input the words
char *words[no_words];
char word[32];
int length;
char *pointerWord;
for (int i = 0; i<no_words; i++) {
    printf("Enter word number %d: ", i);
    scanf("%s", word);
    length = strlen(word);

    for ( int i = 0; i<length; i++) {
    word[i] = tolower(word[i]);
    }

    pointerWord = (char*)malloc(length+1);
    strcpy(pointerWord, word);
    words[i] = pointerWord;
}


// Print word list
printf("You entered:\n");
for (int i = 0; i<no_words; i++) {
    printf("%s\n", words[i]);
}

然而,这段代码(相同,但有一个 while 而不是 for 循环)输出随机字符:

int status = 1;
int *ptrStatus = &status;
int no_words;
int random;
char *selected;


// Get number of words
printf("Enter the no of words you want to enter.\n");
scanf("%d", &no_words);


// Input the words
char *words[no_words];
char word[32];
int length;
char *pointerWord;
for (int i = 0; i<no_words; i++) {
    printf("Enter word number %d: ", i);
    scanf("%s", word);
    length = strlen(word);

    // Why doesn´t this work??
    while(i < length) {
       word[i] = tolower(word[i]);
       printf("i = %d, length = %d and word[i] = %c\n", i, length, word[i]);
       i++;
    }

    pointerWord = (char*)malloc(length+1);
    strcpy(pointerWord, word);
    words[i] = pointerWord;
}


// Print word list
printf("You entered:\n");
for (int i = 0; i<no_words; i++) {
    printf("%s\n", words[i]);
}

例如,当我输入“Hello”时,输出是 @?>???M???H??H?}?H?

有人知道为什么吗?

【问题讨论】:

  • 确定要在那里使用i

标签: c for-loop while-loop


【解决方案1】:

您的第一个代码有两个嵌套的for 循环,每个循环都有一个名为i 的局部变量。内层i“遮蔽”外层i:在最内层循环中i指的是来自内层循环的int i,在外层循环中,但在内层循环之外iint i的外循环。

for (int i = 0; i < no_words; i++) {      // def i1
    // i == i1

    for (int i = 0; i < length; i++) {    // def i2
        // i == i2
    }

    // i == i1
}

在您的第二个代码中,您也将i 用于内部循环,但没有新变量:它与外部循环中的i 相同。所以修改i会搞乱外循环控制。

如果您想使用 while 变体,请声明一个不同的变量,例如 j 并使用它:

for (int i = 0; i < no_words; i++) {
    int j = 0;

    // read word

    while(j < length) {
       word[j] = tolower(word[j]);
       j++;
    }

    // store word as word[i]
}

或者写一个小写字符串的函数。

【讨论】:

    猜你喜欢
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    相关资源
    最近更新 更多