两个不同文件中的代码非常相似,当它们应该给出相同的结果时给出两个不同的结果

时间:2014-12-13 07:31:12

标签: c arrays printf

这个让我挠头。其中一个作品,另一个并不总是有效,我不知道为什么。第一批代码到目前为止工作,但第二批代码偶尔会给出第一批不同的,不正确的结果。对于任何想知道的人来说,这是解决我想做的线性方程的更大程序的一部分。

我可以在两者之间注意到的唯一区别是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

1 个答案:

答案 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