Что входит в локальные переменные по умолчанию? - PullRequest
0 голосов
/ 23 мая 2019

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

Это комментарий моего преподавателя: 1. В вопросе сказано, что должны использоваться только локальные переменные.

Функция чтения должна была считывать и проверять длину входной строки.Строки 14 и 15 должны быть внутри функции чтения, а не в main.

Поскольку вы использовали текст в качестве глобальной переменной, вы смогли писать свои функции без необходимости строкипараметры s, st и str.Цель этого задания состояла в том, чтобы проверить вашу способность программировать со строковыми параметрами.Хотя у ваших функций, похоже, есть строковые параметры, они также могут отсутствовать, поскольку текст является глобальным и содержит только текст в коде внутри функций.Функция чтения должна быть написана с точки зрения s, а не текста.Функция count должна быть написана в терминах st, а не текста.Функция justify должна быть str там, где у вас есть текст.Вы не показали, что понимаете, как используются строковые параметры.

#include<stdio.h>
#include<string.h>
void read(), justify(char *str, int g);
int count(char *st);
int main(){
    char text[100];
    int gaps, i;
    gaps = 0;
    for(i=0; i<3; i++) {
        read(text);
        gaps = count(text);
        justify(text, gaps);
       printf("\n");
    }
}
void read(char *s){
    int length;
    printf("Enter a line of text: ");
    gets(s);
    length = strlen(s);
    while(length!=0){
        if(length<46){
        printf("123456789012345678901234567890123456789012345\n");
            length = 0;
        } else {
            printf("Enter a line of text: ");
          gets(s);
            length = strlen(s);
        }
    }
}
int count(char *st){
    int num, i, num2;
    num = 0;
    num2 = strlen(st);
    for(i=0; i<num2; i++){
        if(st[i]==' '){
            num++;
        }
    }
    return num;
}
void justify(char *str, int g){
    int i, j, num, m, n, temp;
    temp = strlen(str);
    num = 45 - temp;
    m = num / g;
    n = num % g;
    for(i=0; i<temp; i++){
        printf("%c", str[i]);
        if(str[i]==' '){
            for(j=0; j<m; j++){
                printf(" ");
            }
            if(n!=0){
                printf(" ");
                n--;
            }
        }
    }
    printf("\n");
}

Я хотел бы узнать, как улучшить код и заставить его работать без удачи.Ура!

1 Ответ

1 голос
/ 23 мая 2019

Что касается заголовка «Что входит в локальные переменные по умолчанию?»

Ничего. Согласно C 2018 6.7.9 10, «Если объект, имеющий автоматическую продолжительность хранения, не инициализирован явно, его значение является неопределенным». (То, что вы называете «локальной переменной», - это объект с автоматической продолжительностью хранения.) Согласно 3.19 .2 неопределенное значение является либо неопределенным значением, либо представлением ловушки. Согласно 3.19.3, стандарт С не предъявляет требований к выбору значения в любом случае .

Рассмотрим:

int x;
printf("%d", x);
printf("%d", x);

В этих двух случаях printf может печатать разные числа. Значение x не указано в любом случае. Программа не работает.

Кроме того, в 6.3.2.1 2 существует правило, которое сводится к следующему: если вы используете неинициализированную локальную переменную, а ее адрес никогда не принимается, поведение программы не определяется стандартом Си. Это означает, что переменная может не только иметь разные значения в разное время, но и то, что стандарт C вообще не определяет поведение программы. Оператор printf не обязательно будет напечатан. Программа может аварийно завершить работу. Программа может вызывать совершенно разные процедуры от того, что вы ожидаете. Стандарт C не предъявляет никаких требований.

Решение: Инициализируйте свои локальные переменные, написав = SomeInitialValue при их объявлении, как в int x = 0;, или присвоив им значения перед их использованием.

1. В вопросе сказано, что должны использоваться только локальные переменные.

Решение: Использовать только локальные переменные. Удалите глобальные переменные из вашей программы. Если подпрограмме требуются данные от вызывающей стороны, передайте ее с параметром.

2. Функция чтения должна была читать… Строки 14 и 15…

Строки 14 и 15 в коде вашего вопроса не соответствуют строкам, которые должны быть в функции чтения. Вы, кажется, поместили в вопрос код, который отличается от того, на что ссылался преподаватель.

Решение: Поставьте точно код, который преподаватель рассмотрел в вопросе. Следуйте инструкциям репетитора.

3. Потому что вы использовали текст в качестве глобальной переменной ...

См. 1. и 2. выше. Как и в 2., код не соответствует этому комментарию; Вы, кажется, показали код, отличный от того, что рассматривал репетитор. Покажите точный код в вопросе и не используйте глобальные переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...