我想将一个数组拆分为2个数组,第一个数组包含原始数组的小写字母,第二个包含大写字母,并且由于某种原因它会打印一些不相关的字符。
#include <stdio.h>
#include <string.h>
#define LEN 8
int main(void)
{
char str[] = "SHaddOW";
char smallStr[LEN], bigStr[LEN];
int i = 0;
int indexSmall = 0;
int indexBig = 0;
for (i = 0; i <= LEN; i++)
{
if (str[i] <= 'Z')
{
smallStr[indexSmall] = str[i];
indexSmall++;
}
if (str[i] >= 'Z')
{
bigStr[indexBig] = str[i];
indexBig++;
}
}
printf("1: ");
puts(smallStr);
printf("2: ");
puts(bigStr);
system("PAUSE");
return 0;
}
答案 0 :(得分:2)
在创建要测试的字符串之前,请不要定义长度。 在定义要测试的字符串后创建它的长度。
在遇到它们时复制字符,但是@Ed Heal说你必须添加一个空终止符,这样你就可以打印掉两个字符串(它们不是真正的字符串,直到它们被空终止)。
} else {
memcpy(anyStr +a, str +n, 1);
a++;
}
输出:
上:显示 降低:添加
将其添加到if结构(以及支持它的其他代码)
{{1}}
然后:
char str [] =“.S1H2a3d4d5O6W。”;
和:
printf(“其他:%s \ n”,anyStr);
返回:
鞋帮:SHOW
降低:添加
别的什么:.123456。
答案 1 :(得分:2)
更紧凑的方法(可能)更有意义的变量名称:
#include <stdio.h>
#include <ctype.h>
#include <stdint.h>
#include <string.h>
int main ( void ) {
const char str[] = "SHaddOW";
size_t len = strlen(str); /* better to get actual length */
char lowers[len + 1]; /* add one for the nul char */
char uppers[len + 1]; /* (see below) */
int c;
int i = 0;
int n_upper = 0;
int n_lower = 0;
while ((c = str[i++]) != '\0') {
if (isupper(c)) uppers[n_upper++] = c; /* no need to reinvent */
if (islower(c)) lowers[n_lower++] = c; /* the wheel here */
}
uppers[n_upper] = '\0'; /* the nul char ('\0') marks */
lowers[n_lower] = '\0'; /* the end of a C "string" */
printf("1: %s\n", lowers);
printf("2: %s\n", uppers);
return 0;
}
如果您非常关注效率,可以在else
if (islower...
添加const
意味着您“承诺”不会更改数组中的字符。
类型size_t
是整数类型,但可能大于int
。这是strlen()
返回的正确类型。它在<stdint.h>
中定义。尽管如此,使用int
几乎总是可以工作(在大多数系统中,字符串必须是'yooooge',因为它的长度要大于int可以容纳的)。
变量c
被声明为int
而不是char
,因为int
是isXXXXX()
函数的正确类型(已定义)在<ctype.h>
)。这也是一个很好的习惯,因为这个循环与另一个常见习语while ((c = fgetc(fp)) != EOF) ...
之间存在相似之处。
答案 2 :(得分:0)
您应该考虑使用isupper()
和islower()
功能。代码会更清晰。如果你有一些非字母字符怎么办?你的条件不会奏效。
for (i = 0; i < LEN; i++)
{
if (islower(str[i]))
{
smallStr[indexSmall] = str[i];
indexSmall++;
}
else if (isupper(str[i]))
{
bigStr[indexBig] = str[i];
indexBig++;
}
}
正如@Ed Heal提到的那样。为了避免打印垃圾,在for loopt之后你应该为数组添加一个空字符。
smallStr[indexSmall] = '\0';
bigStr[indexBig] = '\0';