Lỗi cú pháp vòng lặp while

Yêu cầu: Viết chương trình sắp xếp các dòng kí tự được nhập từ bàn phím theo thứ tự ABC.

#include <stdio.h>
#include<stdlib.h>
#define MAXLINES 5000
#define MAXLEN 1000
char *lineptr[MAXLINES];
int read_lines(char *lineptr[],int MAXLINES1);
void write_lines(char *lineptr[], int nlines);
void comparison(char *lineptr[],int nlines);
int getline(char line[],int MAXLENS);
void strcpy(char *p,char line[]);
int main()
{
    int nlines;
    if((nlines=read_lines(lineptr,MAXLINES))>=0)
    {
        comparison(lineptr,nlines);
        write_lines(lineptr,nlines);
        return 0;
    }
    else
    {
        printf("error:input too big to sort\n");
        return 1;
    }
}
int read_lines(char *lineptr[],int MAXLINES1)
{
    int len,nlines=0;
    char *p,line[MAXLEN];
    while((len =getline(line,MAXLEN))>0)
        if(nlines>=MAXLINES1 ||(p=(char*)malloc(len))==NULL)
            return -1;
        else
        {
            line[len -1]='\0';
            strcpy(p,line);
            lineptr[nlines++]=p;
        }
    return nlines;
}
void write_lines(char *lineptr[],int  nlines)
{
    int i;
    for(i=0; i<nlines; i++)
        printf("%s\n",lineptr[i]);
}
int getline(char line[],int MAXLENS)
{
    int i;
    char c;
    while(i=0;i<MAXLENS-1&&(c=getchar())!=EOF&&c!='\n';i++)
        line[i]=c;
    if(c=='\n')
    {
        line[i]='\n';
        i++;
    }
    line[i]='\0';
    return i;
}
void strcpy(char *p,char line[])
{
    int i=0;
    p=line;
    while((*p=line[i])!='\0')
    {
        i++;
        p++;
    }
}
void comparison(char *lineptr[],int nlines)
{
    char *c;
    for(int i=0; i<nlines; i++)
    {
        for(int j=0; j<nlines; j++)
        {
            if(lineptr[i][1]>lineptr[j][1])
            {
                lineptr[i]=c;
                lineptr[i]=lineptr[j];
                lineptr[j]=c;
            }

        }
    }
}

Báo lỗi ở

    while(i=0; i<MAXLENS-1&&(c=getchar())!=EOF&&c!='\n'; i++)
        line[i]=c;

Code bị lỗi gì @14520054?

A sửa lại

while(i=0;i<MAXLENS-1&&(c=getchar())!=EOF&&c!='\n';i++)
    line[i]=c;

Thành

for(i=0; (i < MAXLENS-1) && ((c = getchar()) != EOF ) && (c != '\n'); i++)
    line[i]=c;

Không nên đặt câu hỏi như thế này nhé @14520054, tiêu đề không thể hiện được nội dung. Tạo topic để hỏi nhưng không có câu hỏi. @14520054 cũng không nói là lỗi chỗ nào, cách hoạt động của chương trình ra sao.

Lúc chạy chương trình cũng báo lỗi như anh nói nhưng em chả pk sửa sao cả.Thank you anh nhiều.

Em sẽ rút kinh nghiệm.

A sửa lại nội dung rồi đấy, nếu em đặt câu hỏi rõ ràng hơn thì anh sẽ tìm ra lỗi nhanh hơn.

1 Like

Nhờ mọ người kiểm tra lại giúp minh 2 phần sau:

        {
            line[len -1]='\0';
            strcpy(p,line);
            lineptr[nlines++]=p;
        }
int i=0;
    p=line;
    while((*p=line[i])!='\0')
    {
        i++;
        p++;
    }

Chương trình của mình khi build thì không có lỗi gì nhưng khi nhập dữ liệu đề thực hiện thì nó lại thoát ra. Mình có kiểm tra lại nhiều lần, thì chỉ có 2 phần trên là có vấn đề, nhưng chưa biết sửa lại như thế nào.

Vẫn là chương trình trên hả @14520054, em có sửa code gì mới không? Có thì gửi lại tối anh rảnh xem thử cho :smiley:

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXLINES 5000
#define MAXLEN 1000
char *lineptr[MAXLINES];
int read_lines(char *lineptr[],int MAXLINES1);
void write_lines(char *lineptr[], int nlines);
int getline(char line[],int MAXLENS);
void compare(char *lineptr[],int nlines);
int main() {
    int nlines;
    if((nlines=read_lines(lineptr,MAXLINES))>=0) {
        compare(lineptr,nlines);
        write_lines(lineptr,nlines);
        return 0;
    } else {
        printf("error:input too big to sort\n");
        return 1;
    }
}
int read_lines(char *lineptr[],int MAXLINES1) {
    int len,nlines=0;
    char *p,line[MAXLEN];
    while((len=getline(line,MAXLEN))>1)
        if(nlines>=MAXLINES1 ||(p=(char*)malloc(len))==NULL)
            return -1;
        else {
            line[len -1]='\0';
            strcpy(p,line);
            lineptr[nlines++]=p;
        }
    return nlines;
}
void write_lines(char *lineptr[],int nlines) {
    while((nlines--)>0)
        printf("%s\n",*lineptr++);
}
int getline(char line[],int MAXLENS) {
    int i;
    char c;
    for(i=0; i<MAXLENS-1&&(c=getchar())!=EOF&&c!='\n'; i++)
        line[i]=c;
    if(c=='\n') {
        line[i]='\n';
        i++;
    }
    line[i]='\0';
    return i;
}
void compare(char *lineptr[],int nlines) {
    char *tiep;
    for(int i=0; i<nlines; i++) {
        for(int j=0; j<nlines; j++) {
            if(strcmp(lineptr[i],lineptr[j])<0) {
                tiep=lineptr[i];
                lineptr[i]=lineptr[j];
                lineptr[j]=tiep;
            }
        }
    }
}

Em viết lại code rồi nek.Anh kiểm tra lại giúp em với.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?