记事本中的代码与VS

时间:2016-03-09 06:25:05

标签: c

所以我编写了一些代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define SMALLSTRLEN 3
#define BIGSTRLEN 4
#define SMALLASCIIA 97
#define BIGASCIIA 65
#define BIGASCIIZ 90
#define SMALLASCIIZ 122
int main(void)
{

    int i = 0,j=0,q=0;
    char str[] = "SHaddOW";
    char smallStr[SMALLSTRLEN];
    char bigStr[BIGSTRLEN];
    printf("%s", str);
    for (i = 0; str[i]; i++)
    {
        if ((str[i] >= SMALLASCIIA) && (str[i] <= SMALLASCIIZ))
        {
            smallStr[j] = str[i];
            j++;
        }
        else if ((str[i] >= BIGASCIIA) && (str[i] <= BIGASCIIZ))
        {
            bigStr[q] = str[i];
            q++;
        }
    }
    bigStr[q] = "\0";
    puts(smallStr);
    puts(bigStr);
    printf("\n\n\n%s", bigStr);
    //getchar();
    system("PAUSE");
    return 0;
}

bigStr需要包含所有大写字母,并smallStr原始str中的所有小写字母。带有gcc编译器的notepad ++中的输出是:bigStr= SHOWadd , smallStr = add

有人可以告诉我这是什么问题吗?

1 个答案:

答案 0 :(得分:1)

此代码具有缓冲区溢出和未终止的字符串。这就是你用两个编译器获得不同结果的原因:你正在调用未定义的行为。

您的测试字符串有七个字符,三个小写字母和四个大写字母。

您将这些字符附加到smallStrbigStr数组,但这些数组只能为您要追加的实际字符留出空间,而不允许使用空终止符。

设置bigStr[q] = "\0";后,您已使用四个字符填充bigStr数组。在数组结束后,null终止符被写入未定义的位置。

smallStr数组根本没有收到空终止符。如果是这样,它也将以与bigStr相同的方式超过数组的末尾。

smallStrbigStr的长度是硬编码的。如果您使用不同的测试字符串会发生什么?

编写此代码的目标是什么?也许您应该考虑使用std::string在C ++中编写它来避免这些问题。

如果您确实希望在没有字符串库的情况下在C中编写它,请考虑对源字符串进行两次传递。第一遍只是计算小写和大写字符的数量。然后,您可以分配两个正确大小的数组(不要忘记null终止符)。然后第二遍可以填充两个数组并将null终止符附加到每个数组。