[英]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.