如何删除字符数组中的元素或创建没有特定元素的新数组的副本?

时间:2016-10-14 15:54:22

标签: c arrays

我的任务目标是接受用户输入字符串,然后打印出用户输入的英文字母字符(小写和大写)。

例如,如果用户输入:D_!an!_ i12el,则输出为Daniel。 我的方法是循环输入,只删除所有非字母字符,但我不知道如何。请帮助任何想法!这就是我到目前为止所做的:

#include <stdio.h>
#include <string.h>

int main()
{

char my_array[100];

    printf("Enter a message: ");;

    while(strlen(gets (my_array)) == 0);
    printf(" Your message is: %s\n", my_array);

    for(int i = 0; i< strlen(my_array);i++)
    {
        if(my_array[i] < 'A' || my_array[i] > 'z')
        {
           my_array[i] = ' ';
        }
    }
    printf(" Your new message is: %s\n", my_array);
}
编辑:我让我的循环工作只打印出字母字符,但是当我打印元素时它会不断添加额外的字符。例如,D_!a _ *&amp; Ni#32el变为DaNielASCIIV。我不知道为什么会这样。

 for(int i = 0; i< 100;i++)
    {
        if (isalpha(message[i]))
        {
            putchar(message[i]);
        }
    }

3 个答案:

答案 0 :(得分:3)

不是试图更新你拥有的字符串,而是打印出一个字符,如果它是一个字母。

此外,大写和小写字符不会立即相互跟随,因此您需要单独检查它们:

printf(" Your new message is: ");
for(int i = 0; i< strlen(my_array);i++)
{
    if((my_array[i] >= 'A' && my_array[i] <= 'Z') || 
       (my_array[i] >= 'z' && my_array[i] <= 'z'))
    {
       putchar(my_array[i]);
    }
}
printf("\n");

另外,您可以使用检查此功能的函数替换上述if条件:

if (isalpha(my_array[i]))

编辑:

您现在看到额外字符的原因是因为您更改了循环以循环整个数组而不是字符串的长度。回到使用strlen(my_array)代替100,你会没事的。

答案 1 :(得分:0)

使用此模式从数组中删除元素

PutObjectRequest

我们通过,添加匹配的所有内容。这是有效的和就地的。

答案 2 :(得分:0)

循环输入字符串并使用strchr()查看字符是否在字符串"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"中可能更好。这样做的好处是不依赖于字母表中字母的特定顺序(请参阅herehere),并且具有灵活性,以便您可以轻松更改要挑选的字符。然后,您可以在字符串中收集结果,或直接打印过滤后的字符。

char my_array[100];
char filtered_array[100];
char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                  "abcdefghijklmnopqrstuvwxyz";
char *pchar;
int j = 0;

...

for (int i = 0; i < strlen(my_array); i++)
    if ((pchar = strchr(alphabet, my_array[i])) != NULL) {
        filtered_array[j] = *pchar;
        ++j;
    }
filtered_array[j] = '\0';

...

以上代码以字符串形式收集结果。请注意,在filtered_array[]的末尾添加了一个空终止符,因为该字符不会被复制到新数组中。如果要在筛选的字符串中包含空格或连字符,只需将这些字符添加到alphabet[]字符串。