默认情况下,局部变量中有什么?

时间:2019-05-23 12:40:21

标签: c

我已经完成了学校作业,并尝试通过导师的评论来解决。但是,从我的导师最近的电子邮件中,他指出:“如果不进行此更改就可以运气。使用局部变量,您不知道默认情况下它们是什么。”我只是不知道代码中的默认值是什么

这是我的老师的评论: 1.这个问题说只能使用局部变量。

  1. 应该读取函数以及对输入字符串长度的验证。第14行和第15行应位于read函数内部,而不是main函数中。

  2. 由于您使用文本作为全局变量,因此能够编写函数而无需使用字符串参数s,st和str。这项作业的重点是测试您使用字符串参数进行编程的能力。虽然您的函数似乎具有字符串参数,但它们也可能不包含全局文本,而仅包含函数内部代码中的文本。读取功能应使用s而不是文本来编写。计数函数应使用st而不是文本来编写。无论文本在哪里,对齐功能都应具有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 个答案:

答案 0 :(得分:1)

关于标题“默认情况下局部变量是什么?”

什么都没有。根据C 2018 6.7.9 10,“如果未自动初始化具有自动存储期限的对象,则其值不确定。”(您认为“局部变量”是具有自动存储期限的对象。)按照3.19 .2,不确定值是未指定的值或陷阱表示。根据3.19.3,C标准在任何情况下均不要求选择

考虑:

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

在这两种情况下,printf可能会打印不同的数字。在任何情况下都未指定x的值。该程序已损坏。

此外,在6.3.2.1 2中有一条规则相当于:如果您使用未初始化的局部变量,并且从未使用过其地址,则C标准不会定义程序的行为。这意味着,不仅变量在不同时间看起来具有不同的值,而且C标准根本没有定义程序的行为。 printf语句不一定会打印。该程序可能会崩溃。该程序可能会调用与您期望的完全不同的例程。 C标准没有任何要求。

解决方案::通过在声明= SomeInitialValue时编写int x = 0;来初始化局部变量,如在class Association(Base): __tablename__ = 'association' left_id = Column(Integer, ForeignKey('left.id'), primary_key=True) right_id = Column(Integer, ForeignKey('right.id'), primary_key=True) extra_data = Column(String(50)) child = relationship("Child", back_populates="parents") parent = relationship("Parent", back_populates="children") class Parent(Base): __tablename__ = 'left' id = Column(Integer, primary_key=True) children = relationship("Association", back_populates="parent") class Child(Base): __tablename__ = 'right' id = Column(Integer, primary_key=True) parents = relationship("Association", back_populates="child") 中一样,或者在使用它们之前为其赋值。

1。问题是只能使用局部变量。

解决方案:仅使用局部变量。从程序中删除全局变量。如果例程需要来自调用方的数据,则将其与参数一起传递。

2。读取功能应该读取……第14和15行……

问题代码中的第14和15行似乎与应该在read函数中的行相对应。您似乎在代码中提出了与导师所指的内容不同的代码。

解决方案::精确输入导师在问题中审核过的代码。遵循导师的指示。

3。因为您使用文本作为全局变量...

请参阅上面的1.和2.。与2.一样,代码与此注释不匹配;您似乎显示了与导师审查的代码不同的代码。显示问题中的确切代码,不要使用全局变量。