#include <stdio.h>

#define maxWordLength 100
#define working puts("working");

int getline1(char _line[], int _maxWordLength);
void copy(char to[][maxWordLength], char from[], int _rowCounter);


int main (int argc, char *argv[])
{
    char line[maxWordLength];
    char moreThanEightySet[maxWordLength][maxWordLength];                                       //2D array to store lines with characters more than eighty   

    int r_length;  
    int rowCounter = 0;
    int i, j = 0;

    while((r_length = getline1( line, maxWordLength)) > 0)
    {   
        if(r_length > 5)    //5 for testing the condition
        {
            copy( moreThanEightySet, line, rowCounter); 
            rowCounter++;
        }   
    }

    for(i = 0; i < rowCounter; i++)
    {
        printf("\n %s", moreThanEightySet[rowCounter]);
    }


    return 0;
}
int getline1(char _line[], int _maxWordLength)                                                  //reads line inputs and returns the number of characters
{
    int i, c;


    for(i = 0 ; i < _maxWordLength - 1 && (c = getchar()) != EOF && c != '\n' ; i++)
    {
        _line[i] = c;
    }

    if(c == '\n')
    {
        _line[i + 1] = '\n' ;
    }

    _line[i + 1] = '\0' ;

    return i;
}
void copy(char to[][maxWordLength], char from[], int _rowCounter)   
{

    int i = 0;

    while((to[_rowCounter][i] = from[i]) != '\0')
        i++;
    to[_rowCounter][i + 1] = '\0' ;
}

Ich verfolge K & R an diesem Punkt. Mehrdimensionale Arrays wurden noch nicht eingeführt, aber ich möchte experimentieren und 2D-Arrays verwenden, um die Zeilen mit mehr als 80 Zeichen zu speichern. Ist dies die richtige Art, 2D-Arrays zu verwenden? und ich bekomme einen Segmentierungsfehler kann jemand darauf hinweisen, wo der Fehler stattfindet Danke

PS: Ich habe das Programm basierend auf den Kommentaren und aus irgendeinem Grund der 2d-Array-Naht bearbeitet, um nichts zu drucken

0
anvesh mydg 26 Dez. 2015 im 07:48

3 Antworten

Beste Antwort

Ich fand unter der Zeile ein Problem, das Sie zu einem Segmentierungsfehler führen könnte

copy( moreThanEightySet[maxWordLength][maxWordLength], line, rowCounter); 

Grundsätzlich gibt es zwei Probleme mit dieser Linie. 1) moreThanEightySet [100] [100] // maxWordLength = 100, wie Sie es definieren. Bitte haben Sie Verständnis dafür, dass ein Array wie dieses von Index 0 bis 99 nicht 100 beginnt. Index 100 ist ungültig. Sie können also auf dieses Array zugreifen, bis moreThanEightySet [ 99] [99] (welches das letzte Element sein wird). In der obigen Zeile versuchen Sie, auf moreThanEightySet [100] [100] // zuzugreifen, was ungültig ist und möglicherweise zu einem Segmentierungsfehler führt.

2) Die Signatur der Kopierfunktion lautet wie folgt:

void copy(char to[maxWordLength][maxWordLength], char from[], int _rowCounter)

Dies bedeutet, dass ein 2D-Array und ein 1-D-Array sowie eine Ganzzahl akzeptiert werden. Wenn Sie diese Funktion aufrufen, sehen Sie, was Sie als erstes Argument übergeben.

 copy( moreThanEightySet[maxWordLength][maxWordLength], line, rowCounter); 

Das erste Argument ist element bei moreThanEightySet [100] [100]. Es handelt sich nicht um ein 2D-Array. Innerhalb der Kopierfunktion schreiben Sie auf diesen Wert.

Lösung: copy (moreThanEightySet, line, rowCounter); // Übergebe das Array nicht spezifisches Element

Einige weitere Probleme, die ich bei der Kopierfunktion festgestellt habe.

void copy(char to[maxWordLength][maxWordLength], char from[], int _rowCounter)  
{

    int i; //undefined value of i .I think it should be 0 .

    while((to[_rowCounter][i] = from[i]) != '\0')
        i++;
    _rowCounter++;  //you should not increment rowcounter here as it is not doing anything .Ideally you should increment _rowCounter from the position you are calling this function "copy" 
}

Siehe die Kommentare in der obigen Funktion.

 while((r_length = getline1( line, maxWordLength)) > 0)
    {   
        if(r_length > 80)
            copy( moreThanEightySet[maxWordLength][maxWordLength], line, rowCounter);
rowCounter++;//you should increment counter here .       
    }

Ich hoffe das wird helfen.

1
SACHIN GOYAL 26 Dez. 2015 im 05:17

Da es sich um eine Übung aus Kapitel 1 handelt, habe ich versucht, nur mit den bis dahin erlernten Werkzeugen eine Lösung zu finden. Das ist mein Code:

#include <stdio.h>
#define MAXLINE 1000 /* maximum input of chars in the line */
#define MAXTEXT 50000 /* input maximun of chars in the text */
#define MINLINE 80 /* minimun input to print */

int getline(char line[], int maxline);
int concat(char line[], char base[], int position, int len);

main(){
    int len;
    int maxLine;    

    char line[MAXLINE];
    char base[MAXLINE];
    int pos;
    pos = 0;
    while ( (len = getline(line, MAXLINE)) > 0)
        if (len > MINLINE) //Testing if the line has more than 80 chars
            pos = concat(line, base, pos, len);
    printf("Text:\n%s", base);
    return 0;
}

/* Concat the lines */
/* Keeps track of the postion */
int concat(char line[], char base[], int position, int len){
    int i ;
    for (i = 0; i< len && position < MAXTEXT ; i++){
        base[position] = line[i];
        position++;
    }
    return position;
}

/*getline: read a line, return length*/
int getline(char s[], int lim){
    int c , i;
    for (i = 0 ; i <= lim - 1 && (c = getchar()) != EOF && c != '\n'; i++)
        s[i] = c;
    if ( c == '\n'){
        s[i] = c;
        i++;
    }
    s[i] = '\0';
    return i;
}

Ich habe den Text gerade in einem char-Array gespeichert ("base" im Code). Um dies zu erreichen, war es notwendig, die Zeilen (mit der Funktion "concat") zu verketten und die Position zu verfolgen, um die Zeilen beizubehalten. Auf diese Weise kann der Code steuern, welche Zeilen hinzugefügt werden sollen und welche nicht.

PS: Ich schlage vor, die 80 in der MINLINE-Definition durch eine niedrigere Zahl zu ändern, um sie einfach zu testen.

1
Marcelo Coronel 26 März 2018 im 00:21

Mit Bezug auf meinen Kommentar Nummer 1:

Ich habe meinen Code bearbeitet (wie in meinem vorherigen Kommentar vorgeschlagen). Hier ist der vollständige Arbeitscode. Ich persönlich fühle, dass dieser Code weiter verbessert werden kann.

#include <stdio.h>

#define maxWordLength 100

int getline1(char _line[], int _maxWordLength);
void copy(char to[maxWordLength][maxWordLength], char from[], int _rowCounter);

int main (int argc, char *argv[])
{

    char line[maxWordLength]={0};
    char moreThanEightySet[maxWordLength][maxWordLength]={0};                                       //2D array to store lines with characters more than eighty   

    int r_length;  
    int rowCounter = 0;
    int i;

    while((r_length = getline1( line, maxWordLength)) > 0)
    {   
        if(r_length > 80)
            copy( moreThanEightySet, line, rowCounter);

            rowCounter++; //right place to increment it
    }

    for(i = 0; i < rowCounter; i++)
    {
        printf("\n %s", moreThanEightySet[i]);
    }


    return 0;
}
int getline1(char _line[], int _maxWordLength)                                                  //reads line inputs and returns the number of characters
{
    int  i;
    char c;

    for(i = 0 ; i < _maxWordLength - 1 && (c = getchar()) != EOF && c != '\n' ; i++)
    {

        _line[i] = c;
    }

    if(c == '\n')
    {
        _line[i + 1] = '\n' ;
    }
    if(c == '\0')
    {
       _line[i + 1] = 0; ; //I personally feel this condition is not required 
    }

    return i;
}
void copy(char to[maxWordLength][maxWordLength], char from[], int _rowCounter)  
{

    int i=0;
    while((to[_rowCounter][i] = from[i]) != '\0')
        i++;
    to[_rowCounter][i]=0;    
}

Bitte beachten Sie, dass Sie aus bestimmten Gründen die folgenden Bedingungen in Ihrem Code haben.

if(r_length > 80)
                copy( moreThanEightySet, line, rowCounter);

Dies bedeutet, dass Sie von "Zeile" nach "moreThanEightySet" kopieren müssen, bis die Eingabe mehr als 80 Wörter umfasst. Bitte berücksichtigen Sie dies, während Sie die Eingabe eingeben. Andernfalls wird "copy" nicht aufgerufen, und Sie werden am Ende nichts in "moreThanEightySet" drucken. Lassen Sie mich wissen, wenn Sie vor einem anderen Problem stehen.

0
SACHIN GOYAL 26 Dez. 2015 im 06:16