标题:新手,初学程序结构
只看楼主
bxe
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2019-3-21
结帖率:72.22%
已结贴  问题点数:18 回复次数:4 
新手,初学程序结构
程序代码:
// Program 8.6 The functional approach to string sorting
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

bool str_in(char **);
void str_sort(const char *[],int);
void swap( void **p1, void **p2);
void str_out(char *[], int);

const size_t BUFFER_LEN = 256;
const size_t NUM_P = 50;

int main(void)
{
//
    char *pS[NUM_P];
    int count = 0;

    printf("\nEnter successive lines,pressing Enter at the end of"
           " each line.\nJust press Enter to end.\n");

    for(count = 0; count < NUM_P ; count++)
        if(!str_in(&pS[count]))
        break;

    str_sort( pS, count);
    str_out( pS,count);
    return 0;
}
//
bool str_in(char **pString)
{
    char buffer[BUFFER_LEN];

    if(gets(buffer) == NULL);
    {
        printf("\nError reading string.\n");
        exit(1);
    }

    if(buffer[0] == '\0')
        return false;

    *pString = (char*)malloc(strlen(buffer) + 1);

    if(*pString == NULL)
    {
        printf("\nOut of memory.");
        exit(1);
    }

    strcpy(*pString, buffer);
    return true;
}
//

//
void str_sort(const char *p[], int n)
{
    char *ptemp = NULL;
    bool sorted = false;
    while(!sorted)
    {
        sorted = true;
        for(int i = 0 ; i<n-1 ; i++)
            if(strcmp(p[i], p[i + 1]) > 0)
        {
            sorted = false;
            swap(&p[i], &p[i+1]); /* undefined reference to `swap'|*/
        }
    }
}
void swap( void **p1, void **p2)
{
    void *pt = *p1;
    *p1 = *p2;
    *p2 = pt;
}

//
void str_out(char *p[] , int n)
{
    printf("\nYou input sorted in orde is:\n\n");
    for(int i = 0 ; i<n ; i++)
    {
        printf("%s\n", p[i]);
        free(p[i]);
        p[i] = NULL;
    }
    return;
} 

用codeblock编译只有一个错误;提示56行的swap(),未定义,在把swap()前置后,编译成功 (但是存储似乎出错了,返回1)
这是书上的示例,请问:
1,这是编译器造成的么? 因为用vs2017 报了20个错.
2,在开头不是声明了原型么(是这么说吧?)void swap( void **p1, void **p2);为什么还会这样?
程序代码:
//Program 8.6 The functional approach to string sorting
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

bool str_in(char **);
void str_sort(const char *[], int);
void swap(void **p1, void **p2);
void str_out(char *[], int);

const size_t BUFFER_LEN = 256;
const size_t NUM_P = 50;
int main(void)
{
////
////
bool str_in(char **pString)
{
    char buffer[BUFFER_LEN];

    if(gets(buffer) == NULL)
    {
        printf("\nError reading string.\n");
        exit(1);
    }
    if(buffer[0] == '\0')
        return false;

    *pString = (char*)malloc(strlen(buffer)+1);

    if(*pString == NULL)
    {
        printf("\nOut of memory.");
        exit(1);
    }

    strcpy(*pString, buffer);
    return true;
}
///////////////
////////////
void swap(void **p1, void **p2) /*这个必须放在下一个函数的前面,但书上是在后面的*/
{
    void *pt = *p1;
    p1 = *p2;
    *p2 = pt;
}

///////////
//////////
void str_sort(const char *p[], int n)
{
    char *pTemp = NULL;
    bool sorted = false;
    while(!sorted)
    {
        sorted = true;
        for(int i = 0; i<n-1; i++)
        if(strcmp(p[i], p[i + 1]) > 0)
        {
            sorted = false;
            swap(&p[i], &p[i+1]);
        }
    }
}
///////////
///////////

void str_out(char *p[], int n)
{
    printf("\nYour input sorted in order is:\n\n");
    for(int i = 0 ; i<n ; i++)
    {
        printf("%s\n", p[i]);
        free(p[i]);
        p[i] = NULL;
    }
    return ;
}


    char *pS[NUM_P]; /*这个原本在前面 */
    int count = 0;

    printf("\nEnter successive lines, pressing Enter at the end of"
           "each line. \nJust press Enter to end.\n");

    for(count = 0; count < NUM_P; count++)
        if(!str_in(&pS[count]))
        break;

    str_sort( pS, count);
    str_out( pS, count);
    return 0; /*int main(void)的大括号本来是到这的*/
}
昨天太晚,神志不清,今天重新抄了编代码,运行正常,
带还是有2个问题:
1,swap()函数必须放在需要调用它的str_sort()前边,书上是放在后边的,而且main()前声明过模型,请问这是怎么回事?
2,int main(void)函数本来是写在前面的,而且大括号是独立的,但是编译之后,自动把所有函数括了进来,还把char*pS 到  return0,放到了最后,
这是怎么了?
使用code blocke17.12


[此贴子已经被作者于2019-4-22 21:54编辑过]

搜索更多相关主题的帖子: char void int buffer count 
2019-04-22 01:11
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:6 
把const都删了试试。
再把swap参数不要矜持地void,都char了,更接地气一些试一试。

[此贴子已经被作者于2019-4-22 08:53编辑过]


对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2019-04-22 08:51
bxe
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2019-3-21
得分:0 
回复 2楼 forever74
今天重抄了遍,运行正常了,请问有没有那种能快速 辨别代码区别的东西,我想和昨天的对比下,
书上之前倒是有单字符比对的程序,但我想要简单又清晰的那种。。。
2019-04-22 21:50
ZJYTY
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:92
专家分:700
注 册:2018-12-20
得分:6 
回复 3楼 bxe
在线文本比对

http://www.

-------------------------------若有不当之处,敬请谅解-------------------------------
2019-04-22 23:15
Mr_doge
Rank: 5Rank: 5
等 级:贵宾
威 望:10
帖 子:159
专家分:385
注 册:2018-6-28
得分:6 
先不论是否报错,就格式而言,第一段是正确的,第二段是不推荐的,因为第二段代码把函数定义放在函数体内进行了,正常情况环境程序是不会自动变更源码的,更不用说变成这么奇怪的情况了,可能是装了奇怪的插件导致的
    至于vs报错多是正常的,尤其是涉及到字符串的代码,因为vc++的编译标准和c标准有些区别,比如说不能直接处理嵌入复制类函数代码块的字符串常量以及对常量引用参数要加const之类。而像gcc这些编译器就宽松很多,很多不符合标准的代码都能正常编译(但是自由也是有代价的,与之对应的就是所有可能的错误和风险都将由编写者自行承担)。
2019-04-23 22:12



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-494331-1-1.html




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

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