| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4100 人关注过本帖
标题:字符串的连接与求子串,目测只有高手可以帮我解答了
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
原先設計的SSTRING結構是不需要使用'\0'作字符串結束符的。

授人以渔,不授人以鱼。
2014-05-13 21:47
yaojiali920
Rank: 2
等 级:论坛游民
帖 子:33
专家分:14
注 册:2014-2-18
收藏
得分:0 
回复 31 楼 TonyDeng
是这样的,等于说那位兄弟,完全改变了,原来的结构
2014-05-13 21:52
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
是的,所以你最好把原題完整拿出來。這也是我常說的,不要以爲代碼說明一切,尤其在代碼與意圖不吻合的情況下,祗給代碼別人是無所謂替你查錯的,衹會被錯誤的代碼誤導。

[ 本帖最后由 TonyDeng 于 2014-5-13 22:08 编辑 ]

授人以渔,不授人以鱼。
2014-05-13 22:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
其實,如果你做好了這道題,會明白很多東西,比如知道C的字符串處理效率實際上很低,比不上BASIC(這是在8086時代就公認的結論,即使是現在,字符串處理效率最高的語言也數不到C/C++,衹有在C++引入vector後才得到改善),道理何在,根本原因就是C/C++需要搜尋結束符,省了點存儲空間帶來運行效率的降低。

[ 本帖最后由 TonyDeng 于 2014-5-13 22:19 编辑 ]

授人以渔,不授人以鱼。
2014-05-13 22:17
yaojiali920
Rank: 2
等 级:论坛游民
帖 子:33
专家分:14
注 册:2014-2-18
收藏
得分:0 
回复 33 楼 TonyDeng
这就是原题帖
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 256            //定义串允许的最大字符个数
typedef struct 
{
    char string[MAXSIZE];        //MAXSIZE为串的最大长度
    int len;                      //串的实际长度
}SSTRING;                      //串的顺序存储结构表示
            
int str_len(SSTRING *s)            //串的长度计算函数
{
                          ; 
}

void str_input(SSTRING *s)         //串的输入函数
{
    int i=0;                   
    char ch;
    s->len=0;
    while((ch=getchar())!='\n')       //通过循环,从键盘输入一串字符串
    {
        s->string[i]=ch;
        i++;
        s->len++;
    }
    s->string[i]='\0';
}

SSTRING *str_rep(SSTRING *s1,SSTRING *s2,int pos)   
{   //将字符串S1从pos位置处替换S2串
    int i=0,j;
    for(j=pos-1;s1->string[j]!='\0';j++)          //从替换的起始位置开始
        if(s2->string[i]!='\0')
        {
                                  ;       //进行替换
            i++;
        }
        else
        {
            break;
        }
    return s1;
}

SSTRING *str_con(SSTRING *s1,SSTRING *s2)   
{ //将字符串S2连接到S1串的后面,两个串合并成一个串,放到S1串中
    int i=s1->len,j=0,k;
    for(k=0;k<str_len(s2);k++) 
    { 
                              ;
                              ;
                              ;// 通过循环,将S2串的元素逐一复制到S1串的后面,
                              ;// 合并成一个串。
    }
    s1->string[i]='\0';
    return s1;
}

SSTRING *str_sub(SSTRING *sub,SSTRING *s,int pos,int len) 
{//将串S第pos个字符开始的长度为len的字符序列复制到串sub中
   int i=pos-1,j=0,k;
   for(k=1;k<=len;k++)
   {
                             ;//逐一取出S串中从pos开始的元素,并复制到sub串中
                             ;//每复制完一个元素,sub串长度加1。
       i++;
       j++;
   }
   sub->string[j]='\0';
   return sub;
}

void str_print(SSTRING *s)
{//字符串输出显示
    int i;
    for(i=0;i<s->len;i++)
                              ;//依次将串中的字符逐一输出到屏幕显示。
    printf("\n");
}

void showmenu()
{  //显示菜单
    printf("    欢迎使用串操作小软件\n");
    printf("\t1、求串的长度\n");
    printf("\t2、串的替换\n");
    printf("\t3、串的连接\n");
    printf("\t4、求子串\n");
    printf("\t5、退出程序\n");    
}

void main()
{
       int position,length,no;
    SSTRING str,str1,str2;   
    str.len=0;
    str1.len=0,str2.len=0;
    while(1)
    {
        showmenu();
        printf("    请输入你的选择:");
        scanf("%d",&no);
        switch(no)
        {
            case 1:printf("请输入一串字符:");
                   fflush(stdin);
                   str_input(&str);
                   length=str_len(&str);
                   printf("字符串:%s的长度为%d\n",str.string,length);
                   system("pause");
                   system("cls");
                   break;
            case 2:printf("请输入源字符串:");
                   fflush(stdin);
                   str_input(&str1);
                   printf("请输入替换字符串:");
                   fflush(stdin);
                   str_input(&str2);
                   printf("请输入替换位置:");
                   scanf("%d",&position);
                   str_rep(&str1,&str2,position);
                   printf("替换后的结果为:");
                   str_print(&str1);
                   system("pause");
                   system("cls");
                   break;
            case 3:printf("请输入第一串字符:");
                   fflush(stdin);
                   str_input(&str1);
                   printf("请输入第二串字符串:");
                   fflush(stdin);
                   str_input(&str2);
                   str_con(&str1,&str2);
                   printf("两串字符连接后的结果为:");
                   str_print(&str1);
                   system("pause");
                   system("cls");
                   break;
            case 4:printf("请输入一串字符:");
                   fflush(stdin);
                   str_input(&str1);
                   printf("请输入取子串的位置和长度:");
                   scanf("%d%d",&position,&length);
                   str_sub(&str,&str1,position,length);
                   printf("子串为:");
                   puts(str.string);
                   system("pause");
                   system("cls");
                   break;
            case 5:
                   return;
        }
    }        
}
2014-05-14 13:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
給你一個示範,其餘的自己可以做麽?
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

const int MAX_LENGTH = 256;

struct String
{
    char Buffer[MAX_LENGTH];
    int Length;
};

String String_Build(const char* str);                        // 使用cz字符串創建一個String串
void String_Show(String str);                                // 輸出String串的內容
String String_Attach(String str1, String str2);                // 將str2串接到str1的後面
String String_Replace(String str1, String str2, int pos);    // 用str2在指定位置pos處開始替換str1

void Pause(void);

int main(void)
{
    String str1 = String_Build("YaoJiaLi ");
    String str2 = String_Build("Hello, world!");
    String_Show(String_Attach(str1, str2));
    putchar('\n');
    String_Show(String_Replace(str2, str1, 7));

    Pause();
    return EXIT_SUCCESS;
}

String String_Build(const char* str)
{
    String string;

    // 不管用代碼還是人工輸入創建String串,都要記得時刻檢查串長度是否超越極限!
    string.Length = 0;
    for (int index = 0; (str[index] != '\0') && (index < MAX_LENGTH); ++index)
    {
        string.Buffer[string.Length++] = str[index];
    }

    return string;
}

void String_Show(String str)
{
    for (int index = 0; index < str.Length; ++index)
    {
        putchar(str.Buffer[index]);
    }
}

String String_Attach(String str1, String str2)
{
    String str = str1;
    for (int index = 0; (index < str2.Length) && (str.Length < MAX_LENGTH); ++index)
    {
        str.Buffer[str.Length++] = str2.Buffer[index];
    }

    return str;
}

String String_Replace(String str1, String str2, int pos)
{
    String str = str1;

    if (pos < str1.Length)
    {
        for (int index = 0; (index < str2.Length) && (str.Length < MAX_LENGTH); ++index)
        {
            str.Buffer[pos + index] = str2.Buffer[index];
            if (pos + index >= str.Length)
            {
                ++str.Length;
            }
        }
    }

    return str;
}

void Pause(void)
{
    printf_s("\nPress any key to continue...");
    _getch();
}




[ 本帖最后由 TonyDeng 于 2014-5-14 14:53 编辑 ]

授人以渔,不授人以鱼。
2014-05-14 14:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
截取子串那個,你自己做吧。

授人以渔,不授人以鱼。
2014-05-14 14:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
如果你用C++,把這東西封裝成一個類,很好用的。

授人以渔,不授人以鱼。
2014-05-14 14:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
現在回看你原先的程序,才明白那個人為什麽仍要使用'\0'符,可能是因爲,爲了方便使用printf()的"%s"參數輸出字符串。但這樣一來,整個就扭了,等於完全廢掉數據結構中設計length字段的目的。其實,那是因爲他不知道函數printf()內部是不斷地調用putchar()輸出內容的——嗯,可能一開始確實是這樣的,後來改掉了輸出函數的代碼,但沒返回頭改前面的。

[ 本帖最后由 TonyDeng 于 2014-5-14 15:36 编辑 ]

授人以渔,不授人以鱼。
2014-05-14 15:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
BASIC字符串的結構,不是像這裡一樣另外定義一個字段做結構體,而是仍用單一的字符數組,不過首元素儲存的不是字符(其數値不被解讀為字符),而是字符串的長度,真正的內容則從下標1的元素開始,這樣一來,就方便我們使用動態分配內存機制,利用堆空間操縱大量的字符串,釋放起來也方便。現在這個內定定長數組字段的結構,佔用空間大倒是其次,主要是後面釋放內存非常不方便。BASIC之所以硬性規定字符串的最大長度是256字節,就是因爲對單字符char類型的數組來說,首元素的數値最大就是255;其實若使用多字節整數,更大容量的字符串也是這麽做。

現在你若完成這個程序,要把數據結構改成那樣,也是輕而易舉之事。

[ 本帖最后由 TonyDeng 于 2014-5-14 15:49 编辑 ]

授人以渔,不授人以鱼。
2014-05-14 15:45
快速回复:字符串的连接与求子串,目测只有高手可以帮我解答了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.118720 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved