3
Làm thế nào để viết hoa ký tự đầu mỗi từ trong C/C++?
0
Chấn Phong20 đã đăng:

Cho mình hỏi làm thế nào để viết hoa ký tự đầu của mỗi từ khi nhập một chuỗi vào

Input: Toi di hoc tre. Co giao dang giang bai.

Output: Toi Di Hoc Tre. Co Giao Dang Giang Bai.

thêm bình luận...
1
Thành Trung40 đã đăng:

Cấu trúc của một chuỗi trong C bạn có thể xem như một mảng các ký tự với ký tự kết thúc chuỗi cuối cùng là \0. Cho nên nếu bạn đã học mảng rồi thì sẽ rất dễ hiểu, bạn có thể tham khảo đoạn mã nguồn sau,

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


// Hàm viết hoa ký tự đầu của mỗi từ trong 1 chuỗi cho trước
char* vietHoaKyTuDau(char *S){
    char *ketQua = new char[strlen(S)];

    if(S[0] != ' ' && S[0] >= 97)
        ketQua[0] = S[0] - 32;
    else
        ketQua[0] = S[0];

    for(int i = 1; i < strlen(S); i++){
        ketQua[i] = S[i];
        if(S[i] == ' ' && S[i+1] != ' ' && S[i+1] >= 97){
            ketQua[i+1] = S[i+1] - 32;
            i++;
        }
    }

    ketQua[strlen(S)] = '\0';

    return ketQua;
}

int main(){
    char S[300];

    printf("Nhap vao chuoi Input: ");
    fflush(stdin);
    fgets(S, 300, stdin);

    printf("Output: ");
    char* ketQua = vietHoaKyTuDau(S);

    puts(ketQua);
}

Mình giải thích một xíu ở đoạn code trên cho bạn dễ hiểu, có 4 ý chính trong hàm vietHoaKyTuDau mà mình đã sử dụng:

  • Muốn chuyển chữ thường thành chữ hoa trong C/C++ ta chỉ việc trừ ký tự đó đi 32, lý do tại sao bạn có thể xem trên bảng mã ASCII về các ký tự trong C/C++.
  • Xét ký tự đầu tiên của chuỗi, nếu nó không phải là ký tự khoảng trắng (S[0] != ' ') và chưa được ghi in hoa (S[0] >= 97) thì chuyển ký tự đầu tiên thành ký tự hoa.
  • Đối với các ký tự tiếp theo, ta duyệt từng ký tự, nếu gặp ký tự khoảng trắng (S[i] == ' ') tức là đã có thể kết thúc một từ, ta duyệt xem ký tự tiếp theo có phải là ký tự của từ mới hay không (S[i+1] != ' '), đồng thời xét điều kiện ký tự S[i+1] này chưa được in hoa (S[i+1] >= 97) thì ta thực hiện in hoa nó.
  • Đặt ký tự \0 tại cuối chuỗi tại vị trí kết thúc.

Bạn có thể copy đoạn code về chạy thử để kiểm nghiệm kết quả, có lỗi sai chỗ nào thông báo mình nha.

Cảm ơn bạn nhiều, mà trong đoạn code trên bạn sử dụng hai dòng lệnh:

fflush(stdin);
fgets(S, 300, stdin);

Cho mình hỏi nó được dùng để làm gì vậy?

Chấn Phong 09.12.2017

Bạn có tham khảo bài viết Một số cách đọc chuỗi trong C/C++, có một bạn đã giải thích rất rõ về hai câu lệnh bạn đang thắc mắc.

Thành Trung 09.12.2017

Ok, tks bạn.

Chấn Phong 09.12.2017
thêm bình luận...
0
Cộng đồng đã đăng:
for (int i=1; i<=st.size(); i++)
    {
        if (st[i]>='A' && st[i]<='Z' )
            st[i]= tolower (st[i]);
        if (st[i-1]==' ')
        {
            if (st[i]>='a' && st[i]<='z' )
                st[i]=toupper (st[i]);
        }
    }
cout<<st<<endl;
thêm bình luận...
0
Cộng đồng đã đăng:

Bạn có thể sử dụng hàm toupper và viết hoa ký tự đầu mỗi từ trong C++.

Cách sử dụng hàm này xem tại: Chuyển chữ hoa sang chữ thường và ngược lại trong C++

thêm bình luận...
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)