c语言:输入一行英文字符串,把每个单词第一个字母变为大写,输出修改后的字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言:输入一行英文字符串,把每个单词第一个字母变为大写,输出修改后的字符串相关的知识,希望对你有一定的参考价值。

比如说遇到\0就记下一个字符为要变换大写的。我是这样想的,但不会写。

#include<ctype.h>

#include<string.h>

#include<stdio.h>

int main(int argc,char*argv[])

char str[100+1];

int isfirst=1;

char ch;

int i=0;

while((ch=getchar())!=EOF)

if(isalpha(ch))

if(isfirst==1)

ch=toupper(ch);

isfirst=0;

else

isfirst=1;

str[i++]=ch;

str<i>='\\0';

printf("%s\\n",str);

return 0;

扩展资料:

printf用法:

printf()函数的调用格式为:printf("<格式化字符串>",<参量表>)。

其中格式化字符串包括两部分内容:一部分是正常字符,这些字符将按原样输出;另一部分是格式化规定字符,以"%"开始,后跟一个或几个规定字符,用来确定输出内容格式。

参量表是需要输出的一系列参数,其个数必须与格式化字符串所说明的输出参数个数一样多,各参数之间用","分开,且顺序一一对应,否则将会出现意想不到的错误。

比如:

int a=1234;

printf("a=%d\\n",a);

输出结果为a=1234。

scanf()是C语言中的一个输入函数。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include<stdio.h>。

int scanf(const char*restrict format,...);

函数scanf()是从标准输入流stdin(标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。

如:

scanf("%d%d",&a,&b);

函数返回值为int型,如果a和b都被成功读入,那么scanf的返回值就是2。

参考技术A

思路:先定义一个变量f用来标记是否是单词的开始位置,如果是开始位置就输出大写字母,并把f标记成false,如果遇到空格,就把f标记成true。依次遍历字符串即可。

参考代码:

#include "stdio.h" 
int main() 
char a[100];
int i;
bool f=true;
gets(a);
for(i=0;a[i]!='\\0';i++) 
if(f)
printf("%c",a[i]-32);
f=false;

else
printf("%c",a[i]);
if(a[i]==' ')
f=true;

return 0;

/*
运行结果:
i love you
I Love You
*/

参考技术B #include "stdio.h"
#include <string.h>
int main()

char p[100];
int n=0,m=0;
gets(p);
while (n<(int)strlen(p))

if ( (m==0)&&(p[n]>='a')&&(p[n]<='z') ) p[n]-=32;
m++;
if (p[n]==' ') m=0;
n++;

printf ("%s\n",p);

用数组写的,包含了一个求字符串长度的strlen函数,楼主看看吧,测试过了本回答被提问者采纳
参考技术C # include<stdio.h>
# include<string.h>
# include<ctype.h>
void main()

char myarray[100];
int num,i,flag=0;
gets(myarray);
num=strlen(myarray);
for(i=0;i<num;i++)

if(!(islower(myarray[i])||isupper(myarray[i])))

flag=0;

else if((!flag)&&(islower(myarray[i])||isupper(myarray[i])))

flag=1;
myarray[i]=toupper(myarray[i]);


puts(myarray);

追问

看不懂,有没有简单点的,只用数组写的。我们只学了数组。

参考技术D 难道我写的不行吗?
#include <stdio.h>
#include <conio.h>

void A2a_Diap(char *from)

char *a=from;
if(*a>=97 && *a<=122)
*a-=32;
printf("%s",from);


int main(void)

char a[256]="asdf";
printf("before:%s\nafter:",a);
A2a_Disp(a);
getch();
return 0;
追问

看不懂,太难了

追答

我这是最简单的方式,楼上的还用了位运算,估计你更看不懂。
楼下的调用了一堆库函数,可怜的效率啊!爱,算了,答案是给你了,
你不用我也没办法,下了

求助,关于c语言的单词输出程序

题目是这样的,首先用字符串建立一个单词库,里面储存有一定数目(小于100)的单词(单词互不包含,也就是一个单词不能为另一个的前缀),然后用户输入一长串字母,要求是输出在这串字母中出现的单词库中的单词,我想过一个算法,就是从输入字符串的第一个字母开始,然后逐步与单词库中的单词匹配,如果不成功则前两个字母一起匹配,以此类推,知道字符串所有字母都匹配完毕为止。如果第一个不行,那么再从第二个,第三个...开始匹配。但是我感觉算法的效率不高,首先,从一到串长要进行一次循环,然后依次匹配单词库又要进行一次循环,从一开头到串末端又要进行依次循环。共计三次循环,时间效率太低。请问有什么比较好的算法使时间复杂度能到O(n2)到O(n)的级别?

提供三种方法:
1.有多少个单词,开多少个比较线程进行比较;能达到O(n2)缩短到O(n);...
2.在加载单词库后,维护一个单词链表,将每个单词首字符的地址指针用来链表记录,这样就可以用单词去比较用户输入的一长串字母;但不能将时间复杂度缩小到O(n);
3.综合kmp和Shift-And算法,采取位滑动,和位映射结合的方法;时间复杂度能降低,但...仍然不能从O(n2)降到O(n)

所以,开线程是最好达到目的的实现方法;
参考技术A 单词库存储时进行排序,然后建立索引比如a/A-z/Z,从第一位开始一直到最后一位的索引,如果词库太大可以只建立前面部分的索引 参考技术B 新建一个数组english[20]
让english[0]="zero", english[1]="one", english[2]="two"...
然后,对于输入的数字,如果它小于20, 就直接到english数组中去取对应的值.
如果大于等于20小于100,先把十位上的数字取出来, 根据十位数字生成twenty, thirty, fourty, fifty等十位的英文,再把个位取出来,到english数组中去取个位的英文. 如果在100到1000之间,就先取百位......
总之就是这样了
另外,虚机团上产品团购,超级便宜
参考技术C int Index_KMP(char *s, char *t, int pos)
// 利用模式串t的next函数求t在主串s中第pos个字符之后的位置的
// KMP算法。其中,s非空,1<=pos<=strlen(s)
int i = pos;
int j = 1;
while (i<=strlen(s) && j<=strlen(t))
if (j==0 || s[i]==t[j])
++i; ++j;
else j=next[j];

if (j>strlen(t)) return i-strlen(t);
else return 0;


void get_next(char *t, int next[])
// 求模式串t的next函数并存入next数组
int i = 1, j = 0;
next[1]=0;
while (i<strlen(t))
if (j==0 || s[i]==t[j])
++i; ++j;
if (t[i] != t[j]) next[i]=j;
else next[i]=next[j];

else j=next[j];

参考技术D 数据结构 串的模式匹配里有方法实现 。
参考 数据结构(C语言版) 严蔚敏_吴伟民 。
相信你能看懂的 在书本79页 。
可以达到 O(n + m) 。即差不多O(2n)

以上是关于c语言:输入一行英文字符串,把每个单词第一个字母变为大写,输出修改后的字符串的主要内容,如果未能解决你的问题,请参考以下文章

C语言,输入一行英文字母,统计其中有多少个单词,单词之间用空格分隔.

Java如何将每个单词的第一个字符转为大写

c语言:输入一行字符,统计其中的单词个数,单词之间用空格分开

(C语言编程)输入一个英文句子,将每个英文单词的头字母变为大写,单词之间用空格隔开

求助,关于c语言的单词输出程序

ZZNUOJ_用C语言编写程序实现1136:首字母变大写(附完整源码)