因此,我编写了一些代码:

#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

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

最佳答案

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

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

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

设置bigStr[q] = "\0";时,已经用四个字符填充了bigStr数组。空终止符将在数组末尾后的未定义位置写入。

smallStr数组根本不接收空终止符。如果确实如此,它也将以与bigStr相同的方式经过数组的末尾。

smallStrbigStr的长度是硬编码的。如果使用其他测试字符串会怎样?

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

如果确实要使用不带字符串库的C语言编写它,请考虑对源字符串进行两次传递。第一遍只计算小写和大写字符的数量。然后,您可以分配两个大小正确的数组(不要忘记空终止符)。然后第二遍可以填充两个数组,并将空终止符附加到每个数组。

关于c - 记事本中的代码与VS中的代码之间的一些区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35884471/

10-12 02:58