| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 820 人关注过本帖
标题:一个作业,思考了好久,有点想法,但实现起来有点困难,求大神看看
只看楼主 加入收藏
任重道远
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2015-9-12
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:10 
一个作业,思考了好久,有点想法,但实现起来有点困难,求大神看看

/*编写一个函数,接受可变数目的字符串作为参数,按顺序拼接这些字符串成为一个更长的字符串,并返回一个指向新字符串的指针。*/
我理解为:
         1:程序接收用户输入的字符串,且输入的字符串的个数可变;
         2:把数目可变的字符串作为参数,传递给另一个函数;
         3:另一个函数对字符串进行排序
         4:另一个函数对经排序的字符串进行拼接,并返回指向新字符串的指针。
#include <stdio.h>
#include <string.h>                             //程序是我的一些想法,但是具体不知道怎么操作,
#include <stdarg.h>                             //若是想法正确,求大神给出具体的内容。
                                                //若想法错误,求大神给出具体的坚决方法
#define MAX 10

char *har(int num,...);

int main(void)
{
    char *buf[MAX],*new;
    int count,n;

    for(count=0;count<MAX;count++)
    {
        buf[count]=(char *)malloc(sizeof(buf[count]+1));
        printf("Enter a line of text,enter a bland line to break.")
        gets(buf[count]);
        if(strlen(buf[count])==0)
        {
            n=count+1;
            break;
        }
    }
    if(count==MAX)
        n=MAX;

    new=har(n,不确定n的值可变参数列表怎么写);

    printf("\n%s",new);
    return 0;
}

char *har(int num,...)
{
    va_list arg_ptr;
    char new[90];
    int count;

    va_start(arg_ptr,num);

    for(count=0;count<num;count++)
    {
        进行排序。。。
    }

     for(count=0;count<num;count++)
    {
        进行拼接。。。
    }

    new[90]=新字符串;

    va_end(arg_ptr);

    return new;
}
搜索更多相关主题的帖子: 国家队 字符串 教练 拼接 
2015-09-21 11:10
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:10 
/*编写一个函数,接受可变数目的字符串作为参数,按顺序拼接这些字符串成为一个更长的字符串,并返回一个指向新字符串的指针。*/
也就是 fun( "abc", "def", "ghi" ) 能够返回一个指向 "abcdefghi" 的指针

程序代码:
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>

#define strcats( s, ...) strcats_(s,##__VA_ARGS__,NULL)

char* strcats_( const char* s, ... )
{
    size_t n = 1;
    {
        va_list va;
        va_start( va, s );
        for( const char* p=s; p; p=va_arg(va,const char*) )
            n += strlen(p);
        va_end( va );
    }

    char* r = malloc( n * sizeof(char) );
    if( r )
    {
        va_list va;
        va_start( va, s );
        size_t i = 0;
        for( const char* p=s; p; p=va_arg(va,const char*) )
        {
            size_t m = strlen( p );
            memcpy( r+i, p, m );
            i += m;
        }
        va_end( va );
        r[n-1] = '\0';
    }

    return r;
}


#include <stdio.h>

int main( void )
{
    {
        char* s = strcats( NULL );
        if( s )
        {
            printf( "<%s>\n", s );
            free( s );
        }
    }

    {
        char* s = strcats( "abc" );
        if( s )
        {
            printf( "<%s>\n", s );
            free( s );
        }
    }

    {
        char* s = strcats( "ABC", "123", "abc" );
        if( s )
        {
            printf( "<%s>\n", s );
            free( s );
        }
    }

    return 0;
}
输出
<>
<abc>
<ABC123abc>

2015-09-21 12:19
任重道远
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2015-9-12
收藏
得分:0 
回复 2楼 rjsp
  for( const char* p=s; p; p=va_arg(va,const char*) )  E:\code\a20.作业\main.c|16|error: 'for' loop initial declarations are only allowed in C99 mode|
版主,标准似乎不兼容啊,我用的是codeblocks  13.12
那么如果给出的是几个随便的字符串,然后要求在另一个函数中先将这几个字符串进行排序,之后再拼接,因该怎么办呢
2015-09-21 15:44
任重道远
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2015-9-12
收藏
得分:0 
回复 2楼 rjsp
谢谢版主简答,我刚学不久,你写的有些我不怎么明白,我在努力学习,我还想知道如果是按照我对题目的理解
即:      1:程序接收用户输入的字符串,且输入的字符串的个数可变;
          2:把数目可变的字符串作为参数,传递给另一个函数;
          3:另一个函数对字符串进行排序
          4:另一个函数对经排序的字符串进行拼接,并返回指向新字符串的指针。
大致因该怎么做,谢谢版主
2015-09-21 15:50
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
可變數量參數的C語法形式(指用...那種),是現代編程不鼓勵的,有另外的處理辦法,這題目的要求本身就過時,不實現也罷。要拼接未知數量的字符串,有許多中方法可以達到目的,完全不必按照那個要求。

授人以渔,不授人以鱼。
2015-09-21 15:55
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
以下是引用任重道远在2015-9-21 15:44:21的发言:

  for( const char* p=s; p; p=va_arg(va,const char*) )  E:\code\a20.作业\main.c|16|error: 'for' loop initial declarations are only allowed in C99 mode|
版主,标准似乎不兼容啊,我用的是codeblocks  13.12
那么如果给出的是几个随便的字符串,然后要求在另一个函数中先将这几个字符串进行排序,之后再拼接,因该怎么办呢
'for' loop initial declarations are only allowed in C99 mode ----- 这句洋文的意思是:……在上个世纪就支持了,但盘古时代不支持。
我用的是codeblocks  13.12 ------ 你用什么IDE和本问题无关,只取决于你用什么编译器,我猜你用的应该是 gcc或MinGW32,你可以在编译参数中加 -std=c99,如果支持C11的话,加 -std=c11 更好。
先将这几个字符串进行排序 ------ 题目中哪儿要求你排序了,题目中说的是“按顺序”,也就是按输入的先后顺序。
2015-09-21 16:11
任重道远
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2015-9-12
收藏
得分:0 
回复 6楼 rjsp
查了好久,还是不知道怎么在编译参数中添加这些信息啊。。。。怎么破
2015-09-21 19:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
省略符形參是C語言特有的東西,C++編譯器雖然也支持,但正如《C++ Primer》中所警告的,“省略符形參應該僅僅用於C和C++通用的類型。特別應該注意的是,大多數類類型的對象在傳遞給省略符形參時都無法正確拷貝。”也就是說,C++編譯器支持省略符形參語法僅僅用於與C兼容,而C++語言本身是不鼓勵這種用法的,C++有另外的推薦用法可用於數量未知參數的傳遞。書中也提到,varargs的具體用法,須參閱編譯器的文檔,意思是說,那是跟編譯器如何實現有關的東西。

省略符形參有數量限制,不是任意多的形參都可以壓入的,這實際上與題目的要求並不完全相符,所以即使寫了出來,也不能說就完了。

除此之外,省略符形參還有一個重大的缺陷,是這些參數傳遞不會做類型檢查。比如你寫出這個函數,但在實際使用時,傳入的實參不是cz字符串,編譯器也檢查不出錯誤,到運行時,就會出現那種典型的崩潰畫面——就是scanf()和printf()經常會看見的那種,因為這兩個函數使用的正是省略符形參。這也是給你解釋了,為什麼明明寫著%d但給出整數或浮點數,編譯器也不報錯,但在運行時發生崩潰,偏偏又不告訴你錯在哪,這種初學者常見困擾,就是省略符形參造成的,也是C++和別的基於C語言發展出來的高級語言拋棄省略符形參的根本原因,C++祗不過迫於無奈為了兼容C語言而支持罷了(實際上C++語言的創建者自己對這種機制深惡痛絕,罵的更難聽)。

我在這裡之所以補充上面那段話,是要向你傳遞一個信息:哪怕你把這部分知識掌握得很好,其實是沒用的,反而是禍害,用了是害自己、害單位、害用戶,除了考試得分,沒有任何好處。

[ 本帖最后由 TonyDeng 于 2015-9-21 20:30 编辑 ]

授人以渔,不授人以鱼。
2015-09-21 20:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不談用別的語言(C++)機制,單是用純C,也完全可以做到題目的要求,唯一不用的就省略符形參而已。通過傳入一個數組代替省略符形參,就全部迴避了省略符形參的所有缺陷,而且代碼更直接,功能也更強。

授人以渔,不授人以鱼。
2015-09-21 20:27
任重道远
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2015-9-12
收藏
得分:0 
回复 8楼 TonyDeng
谢谢指点
2015-09-21 23:04
快速回复:一个作业,思考了好久,有点想法,但实现起来有点困难,求大神看看
数据加载中...
 
   



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

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