求帮忙不全,实在搞不出了
本帖最后由 u010352157 于 2013-05-20 18:35:56 编辑 红字求解
//从键盘任意输入不超过100个字符的字符串,按要求完成如下操作:
//1. 统计26个字母、9个数字出现的次数,其中字母不区分大小写。将统计结果输出到屏幕上,没有出现的不要输出,输出格式样例如下,其中()括号内的内容不要输出。
//A字母出现的次数: 5(右对齐,占5列)
//2. 对字符串中的所有字母字符加密成其后的第index个字符,,其中index为字母字符在字符串中的位置,要求加密后的字符仍然为字母字符,而且大小写保持不变。特别注意,字母在字符串中的位置值从0开始计算。最后将加密字符串输出到屏幕上。加密样例如下:
//假设字符串为: Abc123wZ
//则加密后的字符串为: Ace123cG
//3. 对加密后的字符串提取所有连续字符段,每段连续字符构成一个字符串。以上一步中的样例字符串为例:则提取的字符串为: Ace和cG
//4. 对提取的所有字符串按字符串长度从小到大排序。并输出到屏幕上,要求每个字符串输出一行。
#include<stdio.h>
#include<string.h>
void tongji(char str[], int result[])
{
int i=0;
while(str[i]!= '\0')
{
if ( str[i]>='A' && str[i]<='Z')
{
result[str[i]-'A']++;
}
if ( str[i]>='a' && str[i]<='z')
{
result[str[i]-'a']++;
}
if ( str[i]>='0' && str[i]<='9')
{
result[str[i]-'0']++;
}
i++;
}
}
void code(char str[])
{
int index=0;
for(index=0;str[index]!='\0';index++)
{
char x=str[index];
if((x>='a'&&x<='z')||(x>='A'&&x<='Z'))
{
if((x+index>'z')||(x+index>'Z'&&x+index<'a'))
{
x=x+index-26;
str[index]=x;
}
else
{
x=x+index;
str[index]=x;
}
}
}
}
void tiqu(char str[],char *data)
{
int i=0,j=0;
while(str[i]!='\0')
{
if(('a'<=str[i]&&str[i]<='z')||('A'<=str[i]&&str[i]<='Z'))
{
data[j++]=str[i];
}
i++;
}
data[j]='\0';
}
//char (*tiqu(char str[]))[20]
//{
//int i=0,j=0,k=0;
//char data[20][20];
//while(str[i]!='\0')
//{
//if(('a'<=str[i]&&str[i]<='z')||('A'<=str[i]&&str[i]<='Z'))
//{
//data[j][k]=str[i];
//k++;
//i++;
//}
//else
//{
//data[j][k]='\0';
//k=0;
//j++;
//}
//}
//data[j][k]='\0';
//
//return data;
//}
//void sort(char str[][20], int count)
//{
//int i,j;
//int index;
//char a[10];
//for (i=0; i<count-1; i++)
//{
//index = i;
//for (j=i+1; j<count; j++)
//{
//if (strlen(str[index]) > strlen(str[j]))
//index = j;
//}
//if (index != i)
//{
//strcpy(a,str[index]);
//strcpy(str[index],str[i]);
//strcpy(str[i],a);
//}
//}
//}
void sort(char *str[])
{
char temp[26];
int i=0,j=0,k=0;
for(i=0;i<j;i++) //排序
{
for(k=i+1;k<j;k++)
{
if(strcmp(str[i],str[k])>0)
{
strcpy(temp,str[i]);
strcpy(str[i],str[k]);
strcpy(str[k],temp);
}
}
}
}
int main()
{
char str[100];
int result[100] = {0};
char data[100];
int i,j;
printf("请输入一个不超过100个字母的字符串:\n");
scanf("%s", str);
tongji(str, result);
for (i=0; i<26; i++)
{
if(result[i]>0)
{
printf("%c的次数: %5d\n", 'a'+i,result[i]);
}
}
for (i=0; i<10; i++)
{
if(result[i]>0)
{
printf("%c的次数: %5d\n", '0'+i,result[i]);
}
}
code(str);
printf("加密后:%s\n",str);
tiqu(str,data);
printf("提取后:");
此处不知如何输出,所以以下别看了
//sort(str);
j=0;
while(str[j]!='\0')
{
printf("排序后:%s\n",str[i++]);
}
return 0;
} 字符串处理
[解决办法]
代码功能不是被人看出来的;而是被单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中分析出来的。
单步调试和设断点调试是程序员必须掌握的技能之一。
[解决办法]
//针对拆字符串和按长度排序输出,按C语言编写
//交换字符串的函数
void swap_buf(char **s1,char **s2)
{
char *ts;
ts=(char*)malloc(strlen(*s1)+1);
strcpy(ts,*s1);
free(*s1);
*s1=(char*)malloc(strlen(*s2)+1);
strcpy(*s1,*s2);
free(*s2);
*s2=(char*)malloc(strlen(ts)+1);
strcpy(*s2,ts);
free(ts);
}
//提取、排序和输出的代码
。。。。。
//加密后要拆分的字符串
char buf[]="asdf77asd7as93214df7asdf8as090f";
//分隔符集合,如果有标点符号请加上
char split[]="0123456789";
char *p=NULL;
//不超过100个字符,最多50个字符串(单字符情况)
char *strbuf[50];
//记录子串个数,同时做索引用
int index=0, clen;
//下面拆分的同时按长度排序
p=strtok(buf,split);
while(p)
{
clen=strlen(p);
strbuf[index]=(char*)malloc(clen+1);
strcpy(strbuf[index],p);
//冒泡排序
if(index>0)
{
for(i=0;i<index;i++)
{
if(clen<strlen(strbuf[i]))
{
swap_buf(&strbuf[index],&strbuf[i]);
}
}
}
index++;
p=strtok(NULL,split);
}
//输出并释放内存
for(i=0;i<index;i++)
{
printf("%s\n",strbuf[i]);
free(strbuf[i]);
}
。。。。。