鱼C论坛

 找回密码
 立即注册
查看: 4279|回复: 19

C语言字符串的问题,我学晕了! 希望版主以及高手解答!

[复制链接]
发表于 2012-4-9 17:38:08 | 显示全部楼层 |阅读模式
3鱼币
编写一个程序,读取输入,直到读取10个字符串或者遇到EOF,二者中最先满足的那个终止读取过程。
然后将读取的字符串按照ASCII码表顺序输出,并且这项功能在单独的函数中进行。


说明下我自己的理解吧:
读取输入10个字符串 我觉得可以这样用
char a[10][100];
int i;
for(i = 0;i < 10 && gets(a[i]) && a[i][0] != EOF;i++){}
然后,读取的字符串按照ASCII码表顺序输出应该是用  strcmp判断,然后交换位置,这里类似于冒泡,
可是我真的不知道字符串该怎么交换位置啊!  应该是交换指针的指向,可是我真的做不出来的。求高手指教!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-4-9 17:38:09 | 显示全部楼层
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define MAX_STRINGS 10
#define MAX_CHARS 100

//这是你要的函数
void string_test(void);

int main(void){
        string_test();
}

struct StringGroup{
        //存放输入的字符串
        char* str_vec[MAX_STRINGS];
        //已经输入的字符串
        int numbers; 
};

void init( struct StringGroup* str_group );
void destroy( struct StringGroup* str_group );
void input( struct StringGroup* str_group );
void output( struct StringGroup* str_group );
void sort( struct StringGroup* str_group );
void swap( char** pstra, char** pstrb );

void string_test(void) {
        struct StringGroup sg;
        init( &sg );
        input( &sg );
        sort( &sg );
        output( &sg );
        destroy( &sg );
}

void init( struct StringGroup* str_group ) {
        str_group->numbers=0;
}

void destroy( struct StringGroup* str_group ) {
        int i;
        for( i=0; i<str_group->numbers; ++i )
                free( str_group->str_vec[i] );
}

void input( struct StringGroup* str_group ) {
        char tmp[MAX_CHARS];
        while( str_group->numbers!=MAX_STRINGS && scanf("%s",tmp)!=EOF ) {
                str_group->str_vec[str_group->numbers] = (char*)malloc( MAX_CHARS );
                strcpy( str_group->str_vec[str_group->numbers], tmp );
                ++str_group->numbers;
        }
}

void output( struct StringGroup* str_group ) {
        int i;
        for( i=0; i<str_group->numbers; ++i ){
                printf("%d:\t%s\n",i,str_group->str_vec[i]);
        }
}

void sort( struct StringGroup* str_group ) {
        int i,j;
        for( i=0;i<str_group->numbers;++i )
                for( j=i+1;j<str_group->numbers;++j )
                        if( strcmp( str_group->str_vec[i], str_group->str_vec[j] )>0 )
                                swap( &str_group->str_vec[i], &str_group->str_vec[j] );
}

void swap( char** pstra, char** pstrb ) {
        char* tmp;
        tmp = *pstra;
        *pstra = *pstrb;
        *pstrb = tmp;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-4-9 17:39:28 | 显示全部楼层
希望高手解答呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-9 18:55:23 | 显示全部楼层
这里提供下思路,主函数的输入要统计总共输入了多少字符串。定义的这个单独的函数有两个参数,一个是这字符串数组,一个是字符串个数,在这个单独的函数中定义一个指针数组,长度10(也可以用malloc根据传入的参数决定数组长度,但是个人觉得浪费程序的效率,malloc语句本身也占用了内存,也节约不了多少,malloc本身执行也要时间),接下来关于字符串数组的交换,用两个参数,一是开始的字符串是第几个,二是结束的字符串是第几个,第一次排序所有数组,然后取前N个第一个ascii相同的字符串返回上一步,再次排序,对于排序结果,取前N个第一个ascii相同的字符串返回上一步,接下来的所有排序方法以此类推
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-9 20:10:53 | 显示全部楼层
本帖最后由 湮汐 于 2012-4-9 20:12 编辑

哇!  光老师你太强了! 我就想到 先把字符串大小的顺序先整理出来,记下下标顺序放在 a【i】中,然后  string [a【i】],用这样方式输出,刚刚也在电脑上调了半天的。
但是看到你的程序,我甘拜下风啊!  好专业啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-9 20:27:51 | 显示全部楼层
扎实的 数据结构 的知识
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-9 20:49:08 | 显示全部楼层
呵呵,没有什么新意,就是基本功而已。用C++的话这题还能写出些令人激动的代码。谁有兴趣用C++试试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-9 21:01:23 | 显示全部楼层
仰望天上的光 发表于 2012-4-9 20:49
呵呵,没有什么新意,就是基本功而已。用C++的话这题还能写出些令人激动的代码。谁有兴趣用C++试试。

看光老师的这个程序我才知道自己的差距还有多大!
相对我用自己的思维编出来的,有点投机取巧的性质。
其实,我有点看不懂光老师的这个程序,而且看的很吃力!应该是自己的基本功还不扎实吧!还要继续学习呢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2012-4-9 21:50:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-9 22:50:49 | 显示全部楼层
前面的C程序显然有许多问题,比如某个字符串特别长就会有问题,还有9楼说的也是一个缺陷。这些缺陷的主要原因是C语言的模型过于低级。作为对比,可以看一下,用C++标准库来实现同样的功能代码是如何的:
#include <string>
#include <set>
#include <iostream>
#include <algorithm>
//#include <iterator>
using namespace std;

//这是你要的函数
void string_test();
int main(){
        string_test();
}

void string_test() {
        const int max_times = 10;
        multiset<string> strs;
        string tmp;
        for( int i=0; i!=max_times && cin>>tmp; ++i )
                strs.insert(tmp);
        copy(strs.begin(), strs.end(), ostream_iterator<string>(cout,"\n"));
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-9 23:57:16 | 显示全部楼层
这么长的程序也能写,强人啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-10 00:27:41 | 显示全部楼层
为你那 76行 代码 ,回复下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-10 01:06:56 | 显示全部楼层
wa... I am newbie.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-10 08:33:20 | 显示全部楼层
挺难的 我都看不明白哦  呵呵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-10 16:55:50 | 显示全部楼层
本帖最后由 haye123 于 2012-4-10 16:58 编辑

我用了差不多1小时半写的.
半年没有写过,可能有些地方会出错.
不知道能不能帮到你!:L
#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#define STRING_SIZE 100
#define SM_SIZE sizeof(struct StringMember)

struct StringMember
{
      char szString[STRING_SIZE];
      int dwNumber;
      struct StringMember * lpNext;
};

typedef struct StringMember stSM;

stSM * Input(void);
void Arrangement(char * lpString);
stSM * Output(stSM * head);
stSM * SaveFile(stSM * head);
void ReleaseMemory(stSM * head);
 
void main()

{
      ReleaseMemory(SaveFile(Output(Input())));
      system("pause");
}

stSM * Input(void)

{
      int i=0;
      stSM * head,* p1,* p2;
      printf("输入若干个字符串(结束输入EOF,回车键确定).按照ASCII码表顺序输出.\n");
      printf("提醒:字符串长度 <= %d字节,输入一次EOF没有结束,请再次输入EOF.\n\n",STRING_SIZE);
      head = p1 = p2 = (stSM *) malloc (SM_SIZE);
      printf("第 %d 个字符串: ",i+1);
      while(scanf("%s",p1->szString) != EOF)
      {
            p2=p1;
            p1->dwNumber=++i;
            Arrangement(p1->szString);
            p1=(stSM *) malloc (SM_SIZE);
            p2->lpNext=p1;
            printf("\n第 %d 个字符串: ",i+1);
      }
      if(!i)
      {
            printf("\n@_@:没有发现1个(或以上)的字符串,程序强制结束!\n\n");
            free(head);
            exit(0);
      }
      p2->lpNext=NULL;
      return(head);
}

stSM * Output(stSM * head)
{
      stSM * p1;
      p1=head;
      printf("\n\n按照ASCII码表顺序如下:\n");
      while(p1)
      {
            printf("\n\n排列后字符串 %d 如下:\n",p1->dwNumber);
            printf("%s",p1->szString);
            p1=p1->lpNext;
      }
      fputc(10,stdout);
      fputc(10,stdout);

      return(head);
}

stSM * SaveFile(stSM * head)
{
      FILE * fp;
      stSM * p1;
      char temp,FileName[STRING_SIZE];
      printf("\n\n是否把已排序的字符串保存在文件?\n(Y/y or N/n): ");
SSS:  temp=getchar();
      if(temp == 'n' || temp == 'N')
      {
            return(head);
      }
      else if(!(temp == 'y' || temp == 'Y'))
      {
            printf("输入错误:(Y或y为需要保存到文件中,N或n则不保存!,请重新输入!\n\n(Y/y or N/n):");
            getchar();
            goto SSS;
      }
      printf("\n\n输入文件名字(例如:Name.txt):");
      scanf("%s",FileName);
      if(!(fp=fopen(FileName,"w+")))
      {
            printf("\n\n无法创建 %s 该文件,程序自动退出!\n",FileName);
            exit(0);
      }
      p1=head;
      while(p1)
      {
            fprintf(fp,"第 %d 次字符串处理后结果:",p1->dwNumber);
            fputs(p1->szString,fp);
            fputc(10,fp);
            fputc(10,fp);
            p1=p1->lpNext;
      }
      fclose(fp);
      printf("\n\n温馨提醒:以上排序后的字符串内容已经保存在 %s 文件中,\n请在程序当前目录查找!\n\n",
            FileName);
      return(head);
}

void ReleaseMemory(stSM * head)
{
      stSM * p1;
      printf("\n程序正在退出,请稍等....-_- .zZ\n草..程序太啰嗦了\n\n");
      while(head)
      {
            p1=head->lpNext;
            free(head);
            head=p1;
      }
      return;
}

void Arrangement(char * lpString)
{

      char temp;
      int i,j;
      for(i=0;* (lpString+i) !=0 ;i++)
      {
            for(j=1;* (lpString+j) != 0;j++)
            {
                  if(*(lpString+j-1) > * (lpString+j) )
                  {
                        temp = * (lpString+j-1);
                        * (lpString+j-1) = * (lpString+j);
                        * (lpString+j) = temp;
                  }
            }
      }
      return;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-10 22:08:23 | 显示全部楼层
来学习的.....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-10 22:33:28 | 显示全部楼层
strlen得出字符串长度,再逐个比较?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-12 20:38:29 | 显示全部楼层
好长攸    :L
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-12 20:48:38 | 显示全部楼层
作为新手 膜拜了!!~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-27 16:12:53 | 显示全部楼层
呵呵,新人求支持
呵呵,新人求支持
呵呵,新人求支持
呵呵,新人求支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 19:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表