为什么for循环使用超出范围的值?

时间:2020-07-19 09:52:50

标签: c loops character user-input

在下面的这段代码中,循环必须在第4个值处结束,因为它是循环的结束,但取而代之的是,它开始使用甚至不遵循循环条件即100的值,甚至不停止..当我输入一个printf语句来测试它时,我就知道了这一点,然后发现它在a [i]中使用100是不可能的。

#include <stdio.h>
#include <string.h>
#include <math.h>

int main()
{
    int n,i,m;
    i=0;
    char a[i];
    printf("how many characters you want to enter=");
    scanf("%d",&n);
    for (i=1;i<=n;i++)
    {
        scanf(" %c",&a[i]);
        printf("%d\n",i);
        //now this loop is not stopping//
    }
    for (i=1;i<=n;i++)
    {
        printf("%c \t",a[i]);
    }

}

输出:-

how many characters you want to enter=4                                                              
a                                                                                                    
1                                                                                                    
b                                                                                                    
2                                                                                                    
c                                                                                                    
3                                                                                                    
d                                                                                                    
100                                                                                                  
e                                                                                                    
101 

2 个答案:

答案 0 :(得分:0)

i=0;
char a[i];

undefined behavior,所以错误。您应该分配一个非空数组automatic variable,或者最好谨慎使用C dynamic memory allocation

阅读Modern C,请参阅this C reference,C编译器(例如GCC ...)和调试器(例如GDB ...)的文档。在使用每个标准功能(例如of scanf)之前,请务必先阅读该文档。请注意,scanf可能会失败并返回您应该测试的有趣整数。

如果您使用GCC,请编译with所有警告和调试信息,因此gcc -Wall -Wextra -g

答案 1 :(得分:0)

...

//now this loop is not stopping//

...

输出:-

...
d
100
e
101 

此(未定义)行为是由于错误大小为0的数组写出的结果, i 在输入“ d”后变为100,然后在输入“ e”后变为101,因为ASCII码为d和e分别是100和101。

正如我在讲话中所说:

i=0;; char a[i];声明一个包含0个元素的数组。做scanf("%d",&n);char a[n];使其具有大小。数组的第一个索引为0,而不是1,因此将for (i=1;i<=n;i++)替换为for (i=0;i<n;i++)。我也建议您检查scanf("%d",&n);返回1,并且 n 是肯定的

所以我不明白你为什么回答:

这行不通,我已经尝试过了

除非您错过了我的评论中的至少一项更正,因为我按照我说的做:

#include <stdio.h>

int main()
{
  int n;
  
  printf("how many characters you want to enter=");
  
  if ((scanf("%d",&n) != 1) || (n < 1))
    puts("invalid size");
  else {
    char a[n];
    int i;
    
    for (i=0; i<n; i++)
    {
      scanf(" %c",&a[i]);
      printf("%d\n",i);
    }

    for (i=0; i<n; i++)
    {
        printf("%c \t",a[i]);
    }
    putchar('\n');
  }
  return 0;
}

编译和执行:

pi@raspberrypi:/tmp $ gcc -Wall cc.c
pi@raspberrypi:/tmp $ ./a.out
how many characters you want to enter=4
a
0
b
1
c
2
d
3
a   b   c   d   
pi@raspberrypi:/tmp $