千古难题 谁能debug ..

时间:2021-10-17 15:02:01
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h> /* toupper() function and others */

#define MAX_WORDLEN 50
#define MAX_WORDS   30000 /* Don't change this or you might overflow your allotted stack space. */
#define true 1
#define false 0

/* Use the following Macros to print EVERYTHING while executing the menu function */

/* Menu print */
#define printMenu() printf("Choose: 'P'rint, 'S'earch, 'I'nsert, 'R'emove, 'C'ount, 'Q'uit :\n")
#define optP() printf("You chose to 'P'rint:\n")
#define optS() printf("Enter word to 'S'earch:\n")
#define optI() printf("Enter word to 'I'nsert:\n")
#define optR() printf("Enter word to 'R'emove:\n")
#define optC() printf("You chose to 'C'ount:\n")
#define optQ() printf("You chose to 'Q'uit:\n")

/* Insert print */
#define printInserted(word) printf("%s was successfully inserted.\n", word)
#define printFailedToInsert(word) printf("Duplicate found, %s was not inserted.\n", word)

/* Remove print */
#define printRemove(word) printf("%s was successfully removed.\n", word)
#define printFailedToRemove(word) printf("%s cannot be found, and was not removed.\n", word)

/* Search print */
#define printFound(word) printf("%s was successfully found.\n", word)
#define printNotFound(word) printf("%s was not found.\n", word)

/* Count print */
#define printCount(count) printf("%d words currently in the dictionary.\n", count)

/* Other than the printf calls above in the macros, and the ones we put into main,
    you should not call printf anywhere else.

    You DO need fprintf in your printDictionary
*/


void printDictionary( char dictionary[][MAX_WORDLEN], int num, FILE *stream );
void insertWord( char dictionary[][MAX_WORDLEN], int *count, char *word );
void removeWord( char dictionary[][MAX_WORDLEN], int *count, char *word );
void loadDictionary( char *infilname, char dictionary[][MAX_WORDLEN], int *count );
void searchWord(char get[MAX_WORDLEN],char dictionary[][MAX_WORDLEN],int *count);
void doMenu( char *outfileName, char dictionary[MAX_WORDS][MAX_WORDLEN], int *count)
{
    while (1)
    {
        char select;
        int i;
        printMenu();
        scanf("%c", &select);
        if (select=='P'||select=='p' )
        {
            optP();
            printDictionary(dictionary,*count,stdout);//未完成..80 char words.
        }
        if(select=='R'||select=='r')
        {
            
            char forremove[MAX_WORDLEN];
            optR();
            fgets(forremove,MAX_WORDLEN,stdin);
            removeWord(dictionary,count,forremove);
            if(0)
                printRemove(forremove);
            if(!0)
                printFailedToRemove(forremove);
         }
        if(select=='S'||select=='s')
        {
            char buffer[MAX_WORDLEN];
            optS();
            fgets(buffer,MAX_WORDLEN,stdin);
            searchWord(buffer,dictionary,count);
            if(0)
                printFound(buffer);
            if(1)
                printNotFound(buffer);
        }
        if(select=='I'||select=='I')    
        {
            char forinsert[MAX_WORDLEN];
            optS();
            fgets(forinsert,MAX_WORDLEN,stdin);
            insertWord(dictionary,count,forinsert);
            if(0)
            printInserted(forinsert);
            if(!0)
            printFailedToInsert(forinsert);
        }
        if(select=='c'||select=='C')
        {
            optC();
            printCount((*count+1));
        }
        if(select=='q'||select=='Q')
        {
            FILE*handlefile;
            handlefile=fopen(outfileName,"w+");
            optQ();
            printDictionary(dictionary,*count,handlefile);
            fclose(handlefile);

        }
    }
}
/*void wordSearch(char dictionary[][MAX_WORDLEN],int*count,char buffer[])
{
    int i;
    int totelldifferent;
    for(i=0;i<*count;i++)
    {
        totelldifferent=strcmp(dictionary[i],buffer);
        if (totelldifferent==0)
            {
                printFound(buffer);
                exit(0);
            }
    }
    printNotFound(buffer);
    exit(1);
}*/
void printDictionary( char dictionary[][MAX_WORDLEN], int num, FILE *stream )
{
     int i;
    for( i=0 ; i<num ; ++i )
    {
            fprintf( stream, "%s\n", dictionary[i] );
    }
}

void insertWord( char dictionary[][MAX_WORDLEN], int *count, char *word )
{
    int sequence;
    int i;
    int j;
    char temp[MAX_WORDS][MAX_WORDLEN];
    strcpy(dictionary[*count],word);
    
    for(i=0;i<*count;i++)
    {
        sequence=strcmp(dictionary[*count],dictionary[i]);
        if(sequence<0)
        {
            for(j=i;j<*count;j++)
            {
                strcpy(temp[j],dictionary[j]);
            }
            for(j=i+1;j<(*count-1);j++)
            {
                strcpy(dictionary[j-1],temp[j]);
            }
            strcpy(dictionary[i],temp[j+1]);
            
        }
        if(sequence==0)
            exit(1);
        
    }
    exit(0);
}
void removeWord( char dictionary[][MAX_WORDLEN], int *count, char *word )
{
    int i,j,k;
    int totelldifferent;
    char temp[MAX_WORDS][MAX_WORDLEN];
    for(i=0;i<*count;i++)
    {
        totelldifferent=strcmp(dictionary[i],word);
        if(totelldifferent==0)
        {
            for(j=i;j<*count;j++)
                strcpy(temp[j],dictionary[j]);
            for(k=i;k<(*count-1);k++)
                strcpy(dictionary[k],temp[k+1]);
                exit (0);
        }
    }
    exit(1);
}

/* LOADDICTIONARY

*/
void loadDictionary( char *infilname, char dictionary[][MAX_WORDLEN], int *count )
{
    FILE*handlefile;
    char buffer[MAX_WORDLEN];
    handlefile=fopen (infilname,"rt");
    while(!handlefile)
    {
        printf("the input file error");
        exit (1);
    }
    while(fgets(buffer,MAX_WORDLEN,handlefile))
    {
        insertWord(dictionary,count,buffer);//count 不能用*count?
        *count+=1;
    }
    fclose(handlefile);
}
void searchWord(char get[MAX_WORDLEN],char dictionary[][MAX_WORDLEN],int *count)
{
    int i=0;
    int tell;
    for(;i<*count;i++)
    {
        tell=strcmp(get,dictionary[i]);
        if(tell==0)
            exit(0);
    }     
    exit(1);
}

/*    M A I N   F U N C T I O N  */

int main( int argc, char *argv[] )
{
    time_t startTime, stopTime;
    clock_t startCPU, stopCPU;
    double elapsedCPUsecs;


    char dictionary[MAX_WORDS][MAX_WORDLEN];
    int count=0;

    if (argc < 3 )
    {
        printf("usage: ./%s <infileName> <outFilename>\n",argv[0]); /* you gotta put in & out file names on cmd line! */
        return EXIT_FAILURE;
    }

    startTime = time( NULL );
    printf("\nStarting load of %s at %s", argv[1], ctime( &startTime) );
    
    startCPU = clock();
    loadDictionary( argv[1], dictionary, &count);
    stopCPU = clock();
    stopTime = time( NULL );
    printf("Finished load of %s at %s", argv[1], ctime( &stopTime) );
    elapsedCPUsecs = ((double)(stopCPU-startCPU)) / CLOCKS_PER_SEC;
    printf("Elapsed CPU seconds: %f\n",  elapsedCPUsecs );
    doMenu( argv[2],  dictionary, &count);
    return EXIT_SUCCESS; /* EXIT_SUCCESS defined as 0 in stdlib.h */
}

31 个解决方案

#1


太难了————————————————MLGBD

#2


单步调试和设断点调试是程序员必须掌握的技能之一。

#3


引用 2 楼 zhao4zhong1 的回复:
单步调试和设断点调试是程序员必须掌握的技能之一。

恩?  怎么做呢?  

#4


VC6的话放置远程配置为Debug,重建所有,开始调试……

#5


这个,真的很难~~~~~

#6


VS2010呢

#7


LZ说说看,哪不行了?

#8


unhandled exception at 0x01172587 in y.exe:0xC00000FD:Stack overflow

#9


没看出哪难
search 就是按照输入顺序线性比较,效率很低
insert remove 的时候效率也低是一方面、而且还浪费空间

insert的bug: if (sequence == 0) break;

总之比较烂

#10


你想表达个啥子??

#11


可以用gdb进行单步调试,设置断点。最简单可以用printf语句调试。

#12


楼主是否是在终端运行的啊?

windows终端运行?还是linux中运行的?

这个程序main函数还有参数的,你要么在windows dos下运行,要么就在linux下运行。。。

程序是没有问题啦,不知道你要说的是程序功能的问题还是其他的什么问题。。。

#13


引用 10 楼 j_now 的回复:
没看出哪难
search 就是按照输入顺序线性比较,效率很低
insert remove 的时候效率也低是一方面、而且还浪费空间

insert的bug: if (sequence == 0) break;

总之比较烂

我是想吸引人进来啦 可以教教我吗? 谢谢

#14


yes! 我在ms下运行的!
引用 13 楼 binqray 的回复:
楼主是否是在终端运行的啊?

windows终端运行?还是linux中运行的?

这个程序main函数还有参数的,你要么在windows dos下运行,要么就在linux下运行。。。

程序是没有问题啦,不知道你要说的是程序功能的问题还是其他的什么问题。。。

#15


单步调试下

#16


引用 13 楼 binqray 的回复:
楼主是否是在终端运行的啊?

windows终端运行?还是linux中运行的?

这个程序main函数还有参数的,你要么在windows dos下运行,要么就在linux下运行。。。

程序是没有问题啦,不知道你要说的是程序功能的问题还是其他的什么问题。。。

但我用cmd运行 一运行 就立即说停止工作的?

#17


你们可以complier到吗?

#18


没看明白,同一楼

#19


楼主你能把你问题说明白吗?贴段代码在这你到底想知道啥

#20


直接写log嘛。。。。。

#21


请问各位 这段代码你们能成功complier吗》?

#22


在VC下compile和link没有问题,只有一个i没有引用的警告.运行有问题,原因是在函数中声明的dictionary[MAX_WORDS][MAX_WORDLEN]和temp[MAX_WORDS][MAX_WORDLEN]太大.解决方法是把他们移到函数外面,或用malloc/calloc.

#23


char temp[MAX_WORDS][MAX_WORDLEN];
void insertWord( char dictionary[][MAX_WORDLEN], int *count, char *word )
{
    int sequence;
    int i;
    int j;
    //char temp[MAX_WORDS][MAX_WORDLEN];

void removeWord( char dictionary[][MAX_WORDLEN], int *count, char *word )
{
    int i,j,k;
    int totelldifferent;
    //char temp[MAX_WORDS][MAX_WORDLEN];


char dictionary[MAX_WORDS][MAX_WORDLEN];
int main( int argc, char *argv[] )
{
    time_t startTime, stopTime;
    clock_t startCPU, stopCPU;
    double elapsedCPUsecs;


    //char dictionary[MAX_WORDS][MAX_WORDLEN];

#24


看来是栈溢出了,你定义的局部数组太大了,栈装不了(一个程序的栈是固定的)!

#25


数组太大是一个问题啊!

建议楼主一个个子功能单独测试,你这样集成测试的话,找错误好难啊!

#26


什么功能,能讲清楚点不,学习

#27


引用 1 楼 csuxiaowu 的回复:
太难了————————————————MLGBD



MLGDXBD 哈哈

#28


引用 26 楼 binqray 的回复:
看来是栈溢出了,你定义的局部数组太大了,栈装不了(一个程序的栈是固定的)!


正解!

#29


凡是比较大的临时变量一律前面加static让其从堆栈存储区挪到全局存储区即可!

#1


太难了————————————————MLGBD

#2


单步调试和设断点调试是程序员必须掌握的技能之一。

#3


引用 2 楼 zhao4zhong1 的回复:
单步调试和设断点调试是程序员必须掌握的技能之一。

恩?  怎么做呢?  

#4


VC6的话放置远程配置为Debug,重建所有,开始调试……

#5


这个,真的很难~~~~~

#6


VS2010呢

#7


LZ说说看,哪不行了?

#8


unhandled exception at 0x01172587 in y.exe:0xC00000FD:Stack overflow

#9


没看出哪难
search 就是按照输入顺序线性比较,效率很低
insert remove 的时候效率也低是一方面、而且还浪费空间

insert的bug: if (sequence == 0) break;

总之比较烂

#10


你想表达个啥子??

#11


可以用gdb进行单步调试,设置断点。最简单可以用printf语句调试。

#12


楼主是否是在终端运行的啊?

windows终端运行?还是linux中运行的?

这个程序main函数还有参数的,你要么在windows dos下运行,要么就在linux下运行。。。

程序是没有问题啦,不知道你要说的是程序功能的问题还是其他的什么问题。。。

#13


引用 10 楼 j_now 的回复:
没看出哪难
search 就是按照输入顺序线性比较,效率很低
insert remove 的时候效率也低是一方面、而且还浪费空间

insert的bug: if (sequence == 0) break;

总之比较烂

我是想吸引人进来啦 可以教教我吗? 谢谢

#14


yes! 我在ms下运行的!
引用 13 楼 binqray 的回复:
楼主是否是在终端运行的啊?

windows终端运行?还是linux中运行的?

这个程序main函数还有参数的,你要么在windows dos下运行,要么就在linux下运行。。。

程序是没有问题啦,不知道你要说的是程序功能的问题还是其他的什么问题。。。

#15


单步调试下

#16


引用 13 楼 binqray 的回复:
楼主是否是在终端运行的啊?

windows终端运行?还是linux中运行的?

这个程序main函数还有参数的,你要么在windows dos下运行,要么就在linux下运行。。。

程序是没有问题啦,不知道你要说的是程序功能的问题还是其他的什么问题。。。

但我用cmd运行 一运行 就立即说停止工作的?

#17


你们可以complier到吗?

#18


没看明白,同一楼

#19


楼主你能把你问题说明白吗?贴段代码在这你到底想知道啥

#20


直接写log嘛。。。。。

#21


请问各位 这段代码你们能成功complier吗》?

#22


在VC下compile和link没有问题,只有一个i没有引用的警告.运行有问题,原因是在函数中声明的dictionary[MAX_WORDS][MAX_WORDLEN]和temp[MAX_WORDS][MAX_WORDLEN]太大.解决方法是把他们移到函数外面,或用malloc/calloc.

#23


char temp[MAX_WORDS][MAX_WORDLEN];
void insertWord( char dictionary[][MAX_WORDLEN], int *count, char *word )
{
    int sequence;
    int i;
    int j;
    //char temp[MAX_WORDS][MAX_WORDLEN];

void removeWord( char dictionary[][MAX_WORDLEN], int *count, char *word )
{
    int i,j,k;
    int totelldifferent;
    //char temp[MAX_WORDS][MAX_WORDLEN];


char dictionary[MAX_WORDS][MAX_WORDLEN];
int main( int argc, char *argv[] )
{
    time_t startTime, stopTime;
    clock_t startCPU, stopCPU;
    double elapsedCPUsecs;


    //char dictionary[MAX_WORDS][MAX_WORDLEN];

#24


看来是栈溢出了,你定义的局部数组太大了,栈装不了(一个程序的栈是固定的)!

#25


数组太大是一个问题啊!

建议楼主一个个子功能单独测试,你这样集成测试的话,找错误好难啊!

#26


什么功能,能讲清楚点不,学习

#27


引用 1 楼 csuxiaowu 的回复:
太难了————————————————MLGBD



MLGDXBD 哈哈

#28


引用 26 楼 binqray 的回复:
看来是栈溢出了,你定义的局部数组太大了,栈装不了(一个程序的栈是固定的)!


正解!

#29


凡是比较大的临时变量一律前面加static让其从堆栈存储区挪到全局存储区即可!