这个让我摸不着头脑。其中一个有效,另一个并不总是有效,我不知道为什么。到目前为止,第一批代码可以工作,但第二批代码有时会给出与第一批不同且不正确的结果。对于任何想知道的人来说,这是我想要求解线性方程的更大程序的一部分。
我可以注意到两者之间的唯一区别是第一个方程数组大小不同,并且其中一个数组是全局声明的,而另一个是在主函数中声明的。我不明白为什么这很重要。
// First File (THIS ONE WORKS)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int co1 = 0;
int i = 0;
char firstEquation[50];
main ()
{
printf("Enter the first equation.. e.g '3x + 2' \n");
fscanf(stdin, " %99[^\n]", firstEquation);
printf("the equation you just entered is: %s \n", firstEquation);
for (i = 0; i < sizeof(firstEquation)/sizeof(firstEquation[0]); i++)
{
if (firstEquation[i] == 'x' || firstEquation[i] == ' '
|| firstEquation[i] == '+'|| firstEquation[i] == '-')
{
printf("%d \n", i);
co1 = i;
}
}
printf("the yintercept of your equation starts at the %d th element in the array", co1+1);
}
这是第二个。
// Second File (THIS ONE STUFFS UP SOMETIMES)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int co1 = 0;
int i = 0;
main ()
{
char firstEquation[100];
printf("Enter the first equation.. e.g '3x + 2' \n");
fscanf(stdin, " %99[^\n]", firstEquation);
printf("the equation you just entered is: %s \n", firstEquation);
for (i = 0; i < sizeof(firstEquation)/sizeof(firstEquation[0]); i++)
{
if (firstEquation[i] == 'x' || firstEquation[i] == ' '
|| firstEquation[i] == '+'|| firstEquation[i] == '-')
{
printf("%d \n", i);
co1 = i;
}
}
printf("the yintercept of your equation starts at the %d th element in the array", co1+1);
}
这是我在两个文件中输入的内容作为测试方法:65x + 554
//OUTPUT OF FIRST BATCH OF CODE (GIVES CORRECT RESULT)
Enter the first equation.. e.g '3x + 2'
65x + 554
the equation you just entered is: 65x + 554
2
3
4
5
the yintercept of your equation starts at the 6 th element in the array
还有第二个。
//OUTPUT OF SECOND BATCH OF CODE (GIVES INCORRECT RESULT)
Enter the first equation.. e.g '3x + 2'
65x + 554
the equation you just entered is: 65x + 554
2
3
4
5
10
the yintercept of your equation starts at the 11 th element in the array
最佳答案
当您尝试访问未初始化的位置时,您的第二个程序会调用未定义的行为。
在第一个程序中,由于 firstEquation
是全局的,因此它将被初始化为 0,而在第二个程序中,它将保持未初始化状态,从而在访问这些位置时调用 UB。
您可以通过使用
将第二个程序中的firstEquation
初始化为 0 来解决此问题
char firstEquation[100]={0};
或者你可以使用memset
来做到这一点:
memset(firstEquation,0,sizeof(firstEquation));
<小时/>
sizeof(firstEquation)/sizeof(firstEquation[0])
在 for
循环中,第一个程序可能返回 50,第二个程序可能返回 100。因此,第一个程序中循环执行 50 次,第二个程序中循环执行 100 次。但是您只需要循环输入的字符数次。因此,使用
for (i = 0; i < strlen(firstEquation); i++)
另外,
fscanf(stdin, " %99[^\n]", firstEquation);
在第一个程序中应该是
fscanf(stdin, " %49[^\n]", firstEquation);
as firstEquation
的长度为 50 个元素,而不是 100 个。使用 int main()
而不是 main()
并添加 return 0;
就在关闭 main
之前。
关于c - 两个不同文件中的代码非常相似,当它们应该给出相同的结果时却给出了两个不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27456600/