2
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...

Câu trả lời của bạn

Chào mừng bạn đến với cộng đồng chia sẻ tri thức BanhoiTuidap.com, bạn có thể chia sẻ bất kỳ sự hiểu biết, nghiên cứu hoặc kinh nghiệm của mình về câu hỏi này với một số lưu ý:
  • Lịch sự, tế nhị.
  • Hạn chế ghi tắt, câu trả lời của bạn chỉ nên tập trung vào câu hỏi ở trên.
Câu trả lời của bạn sẽ được đăng ở chế độ cộng đồng, cho nên bạn sẽ không thể chỉnh sửa sau khi đăng, có thể đăng ký thành viên trên BanhoiTuidap.com khi bạn muốn theo dõi câu hỏi này hoặc chủ đề liên quan.
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)