程序打印不相关的字符

时间:2016-03-09 21:24:18

标签: c arrays

我想将一个数组拆分为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;
}

3 个答案:

答案 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,因为intisXXXXX()函数的正确类型(已定义)在<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';