标题:新手,初学程序结构
取消只看楼主
bxe
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2019-3-21
结帖率:72.22%
已结贴  问题点数:18 回复次数:1 
新手,初学程序结构
程序代码:
// 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
bxe
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2019-3-21
得分:0 
回复 2楼 forever74
今天重抄了遍,运行正常了,请问有没有那种能快速 辨别代码区别的东西,我想和昨天的对比下,
书上之前倒是有单字符比对的程序,但我想要简单又清晰的那种。。。
2019-04-22 21:50



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




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

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