簡體   English   中英

為什么這段代碼會產生無限循環?

[英]Why is this code producing an infinite loop?

#include <Stdio.h>
#include <string.h>

int main(){
    char str[51];
    int k = 1;
    printf("Enter string\n");
    scanf("%s", &str);
    for(int i = 0; i < strlen(str); i++){
        while(str[k] != '\0')){
            if(str[i] == str[k]){
                printf("%c", str[i]);
                k++;
            }
        }
    }

    return 0;
}

這是簡單的 C 代碼,用於檢查字符串中的重復字符並打印字符。 我不明白為什么它會產生無限循環。 str[k]到達 null 終止符時,內部 while 循環應該停止,但程序會無限繼續。

要知道的要點

  • 您不需要將變量str的地址傳遞給scanf()
  • 不要使用"%s" ,使用"%<WIDTH>s" ,以避免緩沖區溢出
  • 始終通過檢查其返回值來檢查scanf()轉換是否成功
  • 始終使用size_t迭代任何數組
  • i < strlen(str) ,使循環的時間復雜度為O(n 3 ) ,而不是O(n 2 ) ,這也不是很好,您應該檢查是否str[i] != 0 但是,許多C的現代編譯器會順便優化它。
  • #include <Stdio.h>非常錯誤, stdio.h != Stdio.h
  • 可以使用puts()putc()優化對printf()的調用,無需任何特殊格式,這里現代編譯器也可以對其進行優化
  • while(str[k] != '\0')){有一個括號 ( ')' )
  • 使用{}初始化變量str ,這會將0分配給str的所有元素

更好的實施

我對這個問題的實現是創建一個初始化為 0 的字符列表(最多 256 個),然后將 1 添加到該列表中字符(來自str )的 ASCII 值。 之后打印那些值大於 1 的字符。

  • 時間復雜度 = O(n) ,其中n是字符串的長度

  • 空間復雜度 = O(NO_OF_CHARACTERS),其中NO_OF_CHARACTERS為 256


最終代碼

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

static void print_dup(const char *str)
{
    size_t *count = calloc(1 << CHAR_BIT, sizeof(size_t));
    for(size_t i = 0; str[i]; i++)
    {
        count[(unsigned char)str[i]]++;
    }
    for (size_t i = 0; i < (1 << CHAR_BIT); i++)
    {
        if(count[i] > 1)
        {
            printf("`%c`, count = %zu\n", i, count[i]);
        }
    }
    free(count);
}

int main(void) {
    char str[51] = {};
    puts("Enter string:");
    if (scanf("%50s", str) != 1)
    {
        perror("bad input");
        return EXIT_FAILURE;
    }
    print_dup(str);
    return EXIT_SUCCESS;
}

用英語閱讀您的代碼:如果索引k處的字符等於索引i處的字符,您只會增加變量k 對於前兩個字符不同的任何字符串,您將遇到無限循環:索引i==0處的char不等於索引k==1處的char ,因此k不會遞增並且while(str[k]!=0)永遠循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM