因此,我编写了一些代码:
#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
有人可以告诉我这是什么问题吗?
最佳答案
此代码具有缓冲区溢出和未终止的字符串。这就是使用两个编译器获得不同结果的原因:您正在调用未定义的行为。
您的测试字符串有七个字符,三个小写字母和四个大写字母。
您将这些字符追加到smallStr
和bigStr
数组中,但是这些数组仅为您要追加的实际字符留出空间,不允许使用空终止符。
设置bigStr[q] = "\0";
时,已经用四个字符填充了bigStr
数组。空终止符将在数组末尾后的未定义位置写入。smallStr
数组根本不接收空终止符。如果确实如此,它也将以与bigStr
相同的方式经过数组的末尾。smallStr
和bigStr
的长度是硬编码的。如果使用其他测试字符串会怎样?
您编写此代码的目标是什么?也许您应该考虑使用std::string
用C ++编写它以避免这些问题。
如果确实要使用不带字符串库的C语言编写它,请考虑对源字符串进行两次传递。第一遍只计算小写和大写字符的数量。然后,您可以分配两个大小正确的数组(不要忘记空终止符)。然后第二遍可以填充两个数组,并将空终止符附加到每个数组。
关于c - 记事本中的代码与VS中的代码之间的一些区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35884471/