1

我是 C 的初学者。我试图在 Code::Blocks 和 Ideone 中运行这段代码,并且都给了我相同的运行时错误。我尝试更改arr[100]arr[101],令人惊讶的是,代码运行了。我也担心 的初始化poo[t],因为它似乎没有在其中存储 的值sum。或者可能sum保留值0(可能是该switch语句不允许char案例吗?)

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int arr[100], t, poo[t], i, j, sum; // refer HOLES

   scanf("%d", &t);

   for (i=0; i<t; i++) {
        scanf("%s", arr);
        j=0;
        sum = 0;
        while (arr[j] != '\0') {
            switch (arr[j])
            {
            case 'B':
                sum = sum + 2;
                break;
            case 'A':
            case 'D':
            case 'O':
            case 'P':
            case 'Q':
            case 'R':
                sum++;
                break;
            default:
                break;
            }
            j++;
        }
        poo[i] = sum;
        printf("%d", poo[i]);
   }

   for (i=0; i<t; i++)
   {
        printf("%d \n", poo[i]);
   }

    return 0;
}
4

5 回答 5

5
int arr[100];
scanf("%s", arr);

如果arr是字符串,则应将其声明为char数组:

char arr[100];
scanf("%s", arr);

“我也担心初始化poo[t]

你应该。以下声明:

int t, poo[t];
scanf("%d", &t);

使用单元化变量t调用未定义的行为

正确初始化poo后声明:t

int t = 0;
scanf("%d", &t);
int poo[t];
于 2013-10-03T19:52:01.273 回答
1

这条线

int arr[100], t, poo[t], i, j, sum; // refer HOLES

不好,因为t在使用前没有初始化。

如果您真的想使用VLA,请这样做

int t;
scanf("&d", t);

int poo[t];
于 2013-10-03T19:50:39.677 回答
0

这里的问题之一是这一行:

scanf("%s", arr);

请注意,arr声明为

int arr[100];

这意味着您正在将一个字符串(一系列chars)读入一个整数数组。这不会导致每个整数包含一个字符;相反,整数的字节将使用字符值填充。因此,当您遍历数组的元素时,您将无法获得像\0.

要解决此问题,请更改 的声明,arr使其成为一个char数组:

char arr[100];

这里可能还有其他问题,但这肯定是您需要解决的问题。

希望这可以帮助!

于 2013-10-03T19:52:52.607 回答
0

您应该 在其poo[t]之后放置scant读取数组的实际大小。

于 2013-10-03T19:53:29.660 回答
0

poo[t]是一个可变长度数组,在 C99 中有效。要使用 VLA,您必须为t.

于 2013-10-03T19:54:17.117 回答