программа выводит фразу выхода вместо слов, хранящихся в C - PullRequest
0 голосов
/ 24 марта 2019

Итак, я работал над заданием для школы и написал вариант этого кода:

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX 100

// This program takes an input of strings and prints them out with a new line separating each one.

int main() {
    char *WordArray[MAX];       //initializing variables
    int i = 0;
    int count = 0;

    printf("enter up to 100 words, that are 20 characters maximum \n");     

    for (i = 0; i <100; i++){                   //runs while there's less than 100 inputs
        char Array[1];
        scanf("%s",Array);                      //stores string in the array
        if (strcmp(Array, "STOP") == 0) {       //compares the string with stop, and if it is, it breaks out of the loop
                 break;
        }
        WordArray[i]=Array;                     //stores the string in the pointer array

    }
    printf("The output is\n");
    for (count = 0; count<i; count++){          //counts up to the amount of words stored
        printf("%s\n",WordArray[count]);        //outputs each pointer string
    }
}

и я заметил, что вывод печатает «STOP» вместо сохраненных значений. У кого-нибудь есть ответы на вопросы, почему и / или как это исправить? Я знаю, что одним из методов является переключение на двумерный массив вместо использования указателей, но я все еще озадачен тем, почему такая программа не будет работать.

1 Ответ

1 голос
/ 24 марта 2019

Ваш char Array[1]; недостаточно велик для хранения чего-либо, кроме пустой строки.Кроме того, когда он работает, каждый указатель будет указывать на одну и ту же строку, которая будет последней записанной вами записью.Это приводит к некоторым исправлениям там, где это комментируется.

#include <stdio.h>
#include <stdlib.h>                         // instead of ctype.h
#include <string.h>

#define MAX 100

// This program takes an input of strings and prints them out with a new line separating each one.

int main() {
    char *WordArray[MAX];    
    int i = 0;
    int count = 0;

    printf("enter up to 100 words, that are 20 characters maximum \n");     

    for (i = 0; i <100; i++){
        char Array[21];                     // increase size of array
        scanf("%20s",Array);                // limit entry length
        if (strcmp(Array, "STOP") == 0) { 
                 break;
        }
        WordArray[i] = strdup(Array);       // allocate memory for and copy string

    }
    printf("The output is\n");
    for (count = 0; count<i; count++){    
        printf("%s\n",WordArray[count]);  
    }

    // free each string's memory
    for (count = 0; count<i; count++){    
        free(WordArray[count]);
    }
}

Вывод программы:

enter up to 100 words, that are 20 characters maximum
one two three STOP
The output is
one
two
three

Редактировать : обратите внимание, что ваш код содержит еще одно неопределенное поведение помимо слишкомкороткая строка char Array[1], которая означает, что вы разыменовываете указатель, который вы сохранили в char *WordArray[MAX];. scope из Array находится внутри цикла for и теоретически перестает существовать после завершения цикла, поэтому сохраненный вами указатель недопустим.Здесь введенное слово дублируется с strdup, поэтому оно не применяется.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...