Thắc mắc về bài tìm và in ra từ dài nhất trong chuỗi nhập vào

Em không hiểu sao cái code C này của em nếu em ko chèn thêm kí tự space vào cuối mảng nhập vào thì không ra đúng kết quả. Em đã tự fix bằng thêm hàm strcat(arr," ") sau khi nhập chhuooix rồi nhưng không hiểu sao lại phải thêm vậy. Mong các anh giúp đỡ ạ. Em cảm ơn ạ.

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>

int main(){
	//khai bao bien
	int i=0,k=0,maxx;
	char arr[10000];
	char max[1000]={'\0'};
	gets(arr);
	strcat(arr," ");//chen them dau space vao sau chuoi
	//max= chuoi dau tien
	while((int) arr[i] == 32){
		i++;  
	}
	while((int ) arr[i] != 32){
		max[k]=arr[i];
		i++;
		k++;
	}

	//xet trong arr
	while(arr[i]!='\0'){
		if( ( int ) arr[i] == 32 && isalnum( arr[i+1]) ){//tim tu trong arr
			int j=i+1,index=0;
			char tmp[1000]={'\0'};
			//gan tu ra mang tmp
			while( !isspace(arr[j])){
				tmp[index]=arr[j];
				index++;
				j++;
				
			}
			tmp [ index ] = '\0' ;//cat duoi tmp
			if ( (int) strlen(tmp) > (int) strlen(max) ) {
				strcpy( max , tmp );
			}
		}
		i++;
	}
	puts(max);
	
	  return 0;
}

Vòng lặp trong không kiểm tra kí tự 0 nên đi ra ngoài luôn (có thể văng lỗi nhưng do trong tầm kiểm soát nên ko gặp). Thêm space vào thì gọi là kĩ thuật lính canh, nhưng không tổng quát được (const char* :smiley: )

4 Likes

Vậy ngoài cách thêm space còn cách nào không ạ. Mong anh giúp đỡ ạ.

Cho mình xác nhận lại. Sherly1001 thì được tách ra thành Sherly hay từ của bạn bao gồm cả chữ số. :slightly_smiling_face:

2 Likes

Từ của em ở đây là cả chữ số ạ. Xâu kí tự dài nhất ko chứa space ấy ạ

Do dòng này.
Nếu cuối dòng mà không có space thì nó cứ chạy mãi.


Cách xử lý là kiểm tra xem đã chạy hết chuỗi chưa rồi mới kiểm tra khác space.

...
#include <stdio.h>
#include <ctype.h>

void longest_sub_string(const char *str) {
    const char *s = str;
    char len = 0;
    
    while (*str) {
        while (*str && !isalnum(*str)) ++str;
        
        int i = 0;
        while (str[i] && isalnum(str[i])) ++i;
        
        if (i > len) {
            s = str;
            len = i;
        }
        
        str += i;
    }
    
    for (const char *c = s; c < s + len; ++c) putchar(*c);
    puts("\n");
}


int main() {
    char s[1000];
    
    fgets(s, 999, stdin);
    
    longest_sub_string(s);
}
Lorem Ipsum is simply dummy text of the printing and typesetting industry.
typesetting
2 Likes

Em cảm ơn anh/chị ạ🙆🙆🙆🙆

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?