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

标签 c arrays printf

这个让我摸不着头脑。其中一个有效,另一个并不总是有效,我不知道为什么。到目前为止,第一批代码可以工作,但第二批代码有时会给出与第一批不同且不正确的结果。对于任何想知道的人来说,这是我想要求解线性方程的更大程序的一部分。

我可以注意到两者之间的唯一区别是第一个方程数组大小不同,并且其中一个数组是全局声明的,而另一个是在主函数中声明的。我不明白为什么这很重要。

// 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/

相关文章:

c - sprintf : printing a percent followed by 0-padded hex

java - 数组唯一元素和移动应用程序数据结构

java - 在 Java 的流中使用 printf

c - 在c中建立一个链表

C函数计算相对路径

c++ - 用数组重载运算符 += C++

Javascript - 根据过滤器对象中存在的任何深度的属性过滤对象数组的通用解决方案

c - 为什么返回值不是我在这个带有宏的 C 程序中所期望的值?

c++ - 如何让 IntelliSense 在 Visual Studio 2008 中可靠地工作

c - 为什么函数不能与指针一起使用?