这个让我挠头。其中一个作品,另一个并不总是有效,我不知道为什么。第一批代码到目前为止工作,但第二批代码偶尔会给出第一批不同的,不正确的结果。对于任何想知道的人来说,这是解决我想做的线性方程的更大程序的一部分。
我可以在两者之间注意到的唯一区别是firstEquation数组大小不同,其中一个数组是全局声明的,而另一个是在main函数中声明的。我不明白为什么这会很重要。
// 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
答案 0 :(得分:1)
当您尝试访问未初始化的位置时,您的第二个程序会调用未定义的行为。
在第一个程序中,由于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);
因为firstEquation
长50个元素,而不是100.使用int main()
代替main()
并在关闭return 0;
之前添加main
。