我已经完成了学校作业,并尝试通过导师的评论来解决。但是,从我的导师最近的电子邮件中,他指出:“如果不进行此更改就可以运气。使用局部变量,您不知道默认情况下它们是什么。”我只是不知道代码中的默认值是什么
这是我的老师的评论: 1.这个问题说只能使用局部变量。
应该读取函数以及对输入字符串长度的验证。第14行和第15行应位于read函数内部,而不是main函数中。
由于您使用文本作为全局变量,因此能够编写函数而无需使用字符串参数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");
}
我想学习如何改进代码并使之正常运行。干杯!
答案 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")
中一样,或者在使用它们之前为其赋值。
解决方案:仅使用局部变量。从程序中删除全局变量。如果例程需要来自调用方的数据,则将其与参数一起传递。
问题代码中的第14和15行似乎与应该在read函数中的行相对应。您似乎在代码中提出了与导师所指的内容不同的代码。
解决方案::精确输入导师在问题中审核过的代码。遵循导师的指示。
请参阅上面的1.和2.。与2.一样,代码与此注释不匹配;您似乎显示了与导师审查的代码不同的代码。显示问题中的确切代码,不要使用全局变量。