PDA

View Full Version : Vấn đề chuyển chuỗi từ chữ hoa sang chữ thường và ngược lại



Boy_Great
26-01-2010, 10:10 PM
Mong các bạn(các anh) giúp hộ bài này:
đổi chuỗi từ chữ thường sang chữ hoa và ngược lại
Em ngĩ là như thế này
int len, i;
char*string=" ";
len=strlen(string);
for (i=0;i<len;i++)
string[i]=toupper(string[i]);/* Tu` chu thuong sang chu hoa*/
string[i]=tolower(string[i]);/* Tu` chu hoa sang chu thuong*/
các bạn(anh) giúp em chạy thử xem. Có lỗi hoặc thuật toán gì khác chỉ giúp em/!\
yh:hoangngodinh

langman
26-01-2010, 10:18 PM
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>


void hoa(char *xau)
{
for(int i=0;i<strlen(xau);i++)
xau[i]=toupper(xau[i]);
}
void thuong(char *xau)
{
for(int i=0;i<strlen(xau);i++)
xau[i]=tolower(xau[i]);
}

main(void)
{
char x[200];
printf("Nhap vao 1 chuoi :");
fflush(stdin);
gets(x);
hoa(x);
printf("Chuoi viet hoa : %s",x);
thuong(x);
printf("\nChuoi viet thuong :%s",x);
getch();
}

tnglinh
31-01-2010, 08:30 AM
C++

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


main(void)
{
char *x;
printf("Nhap vao 1 chuoi :");
fflush(stdin);
gets(x);
printf("Chuoi viet thuong : %s",strlwr(x));
printf("\nChuoi viet hoa :%s",strupr(x));
getch();
}

langman
31-01-2010, 10:32 AM
xin hỏi bạn đang làm cái gì thế ?
int toupper(int);
int tolower(int);

bạn có char x[100];
vậy mà lại gọi được toupper(x) ?? thật là khó hiểu

thiendiep_it
31-01-2010, 11:16 AM
mình có biết hàm chuyển xâu thành xâu chữ thường là:

strlwr(s);
Còn hàm chuyển xâu thành xâu chữ HOA không biết có hay không? Ai biết chia sẻ anh em với nha!

Heyvin
03-02-2010, 09:58 PM
chữ thường thành chữ HOA là strupr(s);

kiennb_54
24-04-2010, 02:59 PM
Có đây!!mọi người cho í kiến nha



#include"iostream.h"

main()
{
char s[50],*b;
cout <<"nhap chuoi" << endl;
gets(s);
//chuyen thanh chu thuong
b = strlwr(s);
cout << b << endl;
//chuyen thanh chu hoa
b = strupr(s);
cout << b << endl;
system("pause");

}

alibaba314
24-04-2010, 03:52 PM
mình không dùng hàm có sẵn mà tự viết được để nó chuyển thành chữ HOA hay là chữ thường được không nhỉ ?

trihn_kt
24-04-2010, 03:57 PM
mình không dùng hàm có sẵn mà tự viết được để nó chuyển thành chữ HOA hay là chữ thường được không nhỉ ?
Chắc chắn là được, dựa vào bảng mã ASCII là ok.

ooDKNYoo
26-04-2010, 01:19 AM
Chào mọi người, xin hỏi cũng với cách trên nhưng chỉ được dùng thư viện stdio.h thôi thì làm thế nào mọi người nhỉ. Yêu cầu đề bài của mình là ở vị trí chẵn 1 chuỗi (0,2,4,6) thì bắt buột là chữ in hoa, ở vị trí lẻ bắt buột là chữ thường. Mình suy nghĩ như thế này:



for (i=0;i<chieudai; i+2)
{ if (password[i] >=97 && password[i]<=122) password[i]=password[i]-32;}

for (i=1;i<chieudai; i+2)
{ if (password[i] >=65 && password[i]<=90) password[i]=password[i]+32;}


Do vì mới học nên viết cú pháp còn sai nên chương trình ko chạy được, ko biết có bác nào sửa hộ ko. Xin cám ơn

pannaruto
26-04-2010, 02:59 AM
Mình thử viết không dùng hàm vầy :


#include <iostream>
#include <string>
using namespace std;

char toUpper( char ch ) { return ( ch < 97 || ch > 122 ) ? ch : ch - 32; }

char toLower( char ch ) { return ( ch < 97 || ch > 122 ) ? ch : ch + 32; }

char* hoa( char* str )
{
for( int i = 0; i < strlen( str ); i++ )
str[i] = toUpper( str[i] );
return str;
}

int main()
{
char str[] = "ba gio roi anh em oi, doi qua :D";

cout << hoa(str) << endl;

system("pause");
return 0;
}

@DKNY sửa cái này for (i=1;i<chieudai; i+2)
Tự sửa nhé ;)

vuonghuynhit
26-04-2010, 08:09 AM
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>


main(void)
{
char x[200];
printf("Nhap vao 1 chuoi :");
fflush(stdin);
gets(x);

printf("Chuoi viet hoa : %s",toupper(x));

printf("\nChuoi viet thuong :%s",tolower(x));
getch();
}

(:#)(:#)(:#)(:#)(:#)(:#)(:#)(:#)(:#)(:#)(:#)(:#)

MrDnD
26-04-2010, 09:25 AM
mình không dùng hàm có sẵn mà tự viết được để nó chuyển thành chữ HOA hay là chữ thường được không nhỉ ?
- (+) 32 là ra chữ hoa (thường) của ký tự trong bảng chữ cái :D

mafiavn2412
10-07-2010, 01:17 PM
Cho mình hỏi chút,mình có dãy kí tự la str[20]= "daI hoc baCh khOA" mình muốn xuất ra màn hình dòng chữ "Dai Hoc Bach Khoa" thì phải làm thế nào.If thuật toán này có ở đâu rồi thì xin các bác chỉ dùm e cái địa chỉ.Cảm ơn các bác nhìu.
mình nghĩ được cái thuật toán này nhưng nó không chạy(kô báo lỗi)

for(i=0;i<strlen(str);i++)
{ if(str[dem]='\0')
str[dem++]=tolower(str[dem++]);
}
printf("%s",str)

dkbcnncb11
10-07-2010, 03:02 PM
str[dem]='\0' kết thúc chuỗi rồi thì sao chuyển hành chữ HOA

và nếu khác điều kiện trong ham if thì biến dem sẽ không tăng .

mafiavn2412
10-07-2010, 03:21 PM
thế làm sao để thể hiện kí tự rỗng ở giữa?còn bạn nói khác điều kiện trong ham ì là sao mình không hiểu?

dkbcnncb11
10-07-2010, 03:50 PM
kí tự rỗng là khoảng cách ' ' hoặc là số 32 .

còn hàm if đó nói chung là bạn thay dem=i; dem++=i . còn lại bạn tự làm đi .

dinhha471
10-07-2010, 06:10 PM
Cho mình hỏi chút,mình có dãy kí tự la str[20]= "daI hoc baCh khOA" mình muốn xuất ra màn hình dòng chữ "Dai Hoc Bach Khoa" thì phải làm thế nào.If thuật toán này có ở đâu rồi thì xin các bác chỉ dùm e cái địa chỉ.Cảm ơn các bác nhìu.
mình nghĩ được cái thuật toán này nhưng nó không chạy(kô báo lỗi)
for(i=0;i<strlen(str);i++)
{ if(str[dem]='\0')
str[dem++]=tolower(str[dem++]);
}
printf("%s",str)

lần đầu nhìn 1 cái code pro thế này đó...
mình giúp idea nha: kiểm tra từ đầu tới cuối mảng..nếu gặp khoảng trắng thì kiểm tra kí tự tiếp theo của khoảng trắng đó..nếu là kí tự chữ cái thì đổi thành kí tự hoa...tiếp tục..cho đến hết mảng..mình cần lưu ý thêm 1 chút nữa là kí tự đầu tiền và đoạn chuỗi ko có khoảng trắng nào chen ở giữa ở cuối chuỗi str..kiếm tra nếu thoả mãn thì đổi thành hoa kí tự đầu tiên hay kí tự đầu tiên của đoạn kí tự cuối chuỗi.
chút ý thôi..bạn tự làm nha.

hienclubvn
10-07-2010, 08:04 PM
@dinhha471, mình thấy bạn ở đâu cũng xuất hiện và idea hay quá.....
code demo đi bạn, nói mà ko làm "ko ai tin đâu"(:#)

donvuon
10-07-2010, 08:24 PM
Mình thử viết không dùng hàm vầy :

@DKNY sửa cái này for (i=1;i<chieudai; i+2)
Tự sửa nhé ;)
Hàm toLower() có chút nhầm lẫn đó. Nên viết tường minh như sau:


char toUpper( char ch )
{
if ('a' <= ch && ch <= 'z') ch = ch-32;
return ch;
}

char toLower( char ch )
{
if ('A' <= ch && ch <= 'Z') ch = ch+32;
return ch;
}

dinhha471
10-07-2010, 10:06 PM
coi thử cái này coi đc không:


#include<stdio.h>
#include<string.h>
#include<ctype.h>
char *chuoi(char *s);
int kt(char *s,int pos);
void main()
{
char s[100];
printf("nhap chuoi: ");
fflush(stdin);
gets(s);
printf("%s\n",chuoi(s));

}
char *chuoi(char *s)
{
int len=strlen(s);
int i;
if(isalpha(s[0]))
s[0]=toupper(s[0]);
for(i=1;i<len-1;i++)
if(s[i]==32)
if(isalpha(s[i+1]))
s[i+1]=toupper(s[i+1]);
if(kt(s,i+1))
s[i+1]=toupper(s[i+1]);
return s;
}


int kt(char *s,int pos)
{
for(int i=pos;i<strlen(s)-1;i++)
if(!isalpha(s[i]))
return 0;
return 1;
}

@hienclubvn: ăn nói trong 4rum cho đàng hoàng...trong 4rum có rất nhiều người giỏi..vào đây để học hỏi thì phải biết ngậm cái miệng lại..đừng ba hoa kiểu đó..mới đc có 1 tý mà đi quanh ba hoa là không tốt..ngậm cái miệng lại dùm..tui ko thích chữi người khác nhưng nói năng có chút tôn trọng người khác thì người khác thì họ mới tôn trọng lại..

nguyenthanhhai90vp
13-07-2010, 10:31 AM
#include<conio.h>
#include<stdio.h>
#include<string.h>
main()
{
char s[100];
printf("Nhap s:");
gets(s);
for(int i=0;i<strlen(s);i++)
{
if(s[i]>='a' && s[i]<='z')
s[i]=s[i]-32;
else if(s[i]>='A'&&s[i]<='Z')
s[i]=s[i]+32;
}
printf("\n Chuoi sau khi doi:");
puts(s);
getch();
}

MINH MOI HOC C MONG CA NHA TRONG CONG DONG C VIET CHI BAO THEM

VoTichSu
13-07-2010, 09:37 PM
@nguyenthanhhai90vp:
Bài của bạn là đổi hoa thành thường và ngược lại. Muốn đổi chuỗi thành tên (chỉ hoa ở đầu chữ) như yêu cầu của mafiavn2412 thì phải làm cách khác, như dinhha471 là một cách.

Tôi thì theo giải thuật này:


Đăt một tri dc (đầu chuỗi)
Đọc dọc chuỗi, thấy dấu trống thì đặt dc = 1
Không thấy dấu trống thì nếu dc = 1 thì đổi thành hoa, không thì đổi thành thường, và đặt dc = 0
Đọc tiếp



char DoiKyTu(char c, int dc)
{
if (dc && c >= 'a' && c <= 'z') return c - 32; /* đầu chữ, đổi ra hoa */
if (!dc && c >= 'A' && c <= 'Z') return c + 32; /* giữa chữ, đổi ra thường */
return c;
}

char *ChuoiHoTen(char *s)
{
int dt;
char *t; /* con trỏ đọc chuõi */
t = s;
dt = 1; /* bắt đầu là đầu chữ */
while (*t != '\0') { /* đọc đến cuối chuỗi */ {
if (*t == ' ' || *t == ',') /* dấu trống hoặc dấu phẩy */
dc = 1;
else {
*t = DoiKyTu(*t, dc);
dc = 0;
}
t++;
}
return s;
}

pannaruto
13-07-2010, 10:26 PM
Hàm toLower() có chút nhầm lẫn đó. Nên viết tường minh như sau:

Em đoảng quá. Thử có hàm trên cứ nghĩ là đúng rồi. Sửa lại như anh là ổn rồi ^_^

VoTichSu
14-07-2010, 12:40 PM
Tiếp tục bài đổi chuỗi thành chuỗi tên họ. Nằm vắt tay lên trán ngẫm lại, thuật toán đổi ký tự tùy thuộc vào ký tự đi trước nó (xb. dinhha471) có vẻ hay hơn. Viết lại như vầy:



char DoiHoa(char c) { return ((c < 'a' || c > 'z')? c : c - 32 ); }
char DoiThuong(char c) { return ((c < 'A' || c > 'Z')? c : c + 32 ); }

int NgoaiChu(char c) {
/* hàm xét xem ký tự có phải nằm ngoài một từ hay không */
return (c == ' ' || c == ',' || c == '.' || c == ';'); /* thêm bớt ký tự theo nhu cầu */
}

char DoiKyTu(char *c) {
/* nếu ký tự đi trước nằm ngoài từ, đổi ký tự này ra hoa, không thì đổi ra thường */
return ((NgoaiChu(*(c-1))) ? DoiHoa(*c) : DoiThuong(*c));
}

char *ChuoiHoTen(char *s)
{
char *t; /* con trỏ đọc chuõi */
t = s;
while (*t != '\0') { /* đọc đến cuối chuỗi */
if (t == s) DoiHoa(*t); /* kt đầu tiên */
else *t = DoiKyTu(t);
t++;
}
return s;
}

nguyenthanhhai90vp
22-07-2010, 10:39 PM
bạn votichsu bạn chạy bài của mình chưa
bạn chưa chạy thì làm sao biết dược tớ sai hả bạn

VoTichSu
23-07-2010, 01:20 PM
@nguyenthanhhai90vp:
Xin lỗi, mình nhầm

Thomas
23-07-2010, 07:24 PM
Hình như toupper, tolower chỉ dùng để chuyển một ký tự trong chuỗi còn muốn chuyển toàn bộ chuỗi thì dùng strlwr, strupr thì phải.

Doreamon9x
24-07-2010, 09:36 AM
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{
clrscr();
char chuoi[255],*s;
printf("Nhap chuoi ki tu :");
scanf("%s",chuoi);
s=chuoi; //co the s=trupr(chuoi)
strupr(s);
printf("Chuoi in hoa la :%s",s);
getch();
}

đây là bài của mình. Các bạn tham khảo nhé

còn đây là chuyển chữ hoa sang thường :


#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{
clrscr();
char chuoi[50],*s;
printf("Nhap vao chuoi ki tu in hoa :");
gets(chuoi);
s=chuoi;
strlwr(s);
printf("Chuoi in thuong la :%s",s);
getch();
}

TQN
24-07-2010, 05:16 PM
Trong tất cả các code, code nào dùng toupper, tolower, strupr, strlwr là đúng. Còn các code # chỉ đúng khi chuỗi là ANSI, English, còn tiếng # thì sai: Japan, VN....
VD đơn giản nhất là đ và Đ của tiếng Việt ta.

tuanpro2008
21-04-2011, 08:41 AM
bài tập của thầy mình là gõ thường thành hoa, gõ hoa thành thường, gõ số thành chính số đó. (chi go 1 ky tu thoi), nhưng nếu ký tự gõ vào không phải những trường hợp trên thì hiện thông báo" ban da nhap mot ky tu dat biet).
vay la het
bài mình làm chạy được 2/3 thôi. Vì nhập ký tự đặt biệt hiện lên ký tự đặt biệt luôn.
các bạn giúp mình với

nhanlbkit
24-06-2011, 04:16 PM
Ai giải thích dùm em 2 đoạn code này với


#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
#define N 100
void Xulychuoi()
{

char str[N];
int i =0;
printf("\n Nhap chuoi ky tu: ");
fflush(stdin);
gets(str);
hoa(str); // Error
printf("\n Chuoi hoa %s", str);
}
void hoa(char *xau)
{
for(int i=0;i<strlen(xau);i++)
{
if(i==0)
xau[i] = toupper(xau[i]);
if(xau[i]== ' ')
xau[i+1]=toupper(xau[i+1]);
else
xau[i+1]=tolower(xau[i+1]);
}
}
main(void)
{
Xulychuoi();
}

// Code trên này bị lỗi

// Đoạn dưới này chạy tốt


#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
#define N 100
void Xulychuoi()
{

char str[200];
int i =0;
printf("\n Nhap chuoi ky tu: ");
fflush(stdin);
gets(str);
//hoa(str); // Error
printf("\n Chuoi hoa %s", str);
}
void hoa(char *xau)
{
for(int i=0;i<strlen(xau);i++)
{
if(i==0)
xau[i] = toupper(xau[i]);
if(xau[i]== ' ')
xau[i+1]=toupper(xau[i+1]);
else
xau[i+1]=tolower(xau[i+1]);
}
}
main(void)
{
char str[N];
int i =0;
printf("\n Nhap chuoi ky tu: ");
fflush(stdin);
gets(str);
hoa(str); // Error
printf("\n Chuoi hoa %s", str);
}