创建一个仅包含旧字符串中的字母数字字符的新字符串

时间:2012-01-04 13:11:43

标签: c string

只使用stdio.h,string.h和stdlib.h库我将如何实现它?

我对编程很陌生,所以请耐心等待我!

4 个答案:

答案 0 :(得分:3)

  1. 分配与字符串长度相同的新char数组。说服自己这是足够的空间。不要忘记NUL。
  2. 循环遍历字符串,仅将那些字母数字字符复制到新字符串。如果不包括<ctype.h>并使用该标题中的函数/宏,则无法移植,除非您要枚举您认为是字母数字的所有字符。
  3. 再次,不要忘记NUL。

答案 1 :(得分:1)

由于这是作业,这里是口头描述:

在原始字符串上运行循环,并使用函数isalnum()确定字符是否为字母数字。保持合理大小的第二char array,每次遇到AlphaNum时,将其插入该数组。将所有AlphaNum字符复制到第二个数组后, NULL 将其终止并且您有字符串。

注意:isalnum()ctype.h中定义,因此如果您不允许使用它,则可能需要自己定义此功能。这是它自己的另一种练习。

答案 2 :(得分:1)

您在字符串中读取的每个字符都是一个字节(您可以将其视为0到255之间的数字,这就是计算机处理它们的方式),因此您只需要检查ascii表以查看字母引用的字符。

每个字母数字字符都在此范围内:[48,58](对于数字),或[65,90](大写),或[97,122](小写)。

看看这个:

#include <stdio.h>
#include <stdlib.h>

#define SIZE    64

int isalphanum(char);    /*states if a char is alphanumerical or not*/
char *getalphanum(char *, char*);    /*modifies the second string to get the result*/

int main(void) {
    char in[SIZE] = "Hello, W@#@#@#@#@#orl...,.,d!";    /*just a random to try out*/
    char out[SIZE];
    getalphanum(in, out);
    printf("%s", out);
    return 0;
}

int isalphanum(char a) {
    if ((a >= 48) && (a <= 58))
        return 1;
    if ((a >= 65) && (a <= 90))
        return 1;
    if ((a >= 97) && (a <= 122))
        return 1;
    return 0;
}

char *getalphanum(char *s, char *t) {
    if ((s == NULL) || (t == NULL))    /*tests if the strings are "handble"*/
        return NULL;
    int i = 0;
    int j = 0;
    char c;
    while ((c = *(s + i)) != '\0') {
    if (isalphanum(c)){
        *(t + j) = c;
        j++;
    }  
    i++;
    }
    *(t + j) = '\0';
    return t;
}

这段代码非常简单,可以改进,但是你需要的东西很多。

答案 3 :(得分:0)

最好的方法是使用isalnum()中的ctype.h,但现在这不是一个选项,我写了一个名为isalnum_not_prefered()的非标准/非便携函数,它是相当于ctype.h的{​​{1}}。

isalnum()

注意事项:

  1. #include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> int isalnum_not_prefered(char s) { if((s >= 'A' && s <= 'Z') || (s >= 'a' && s <= 'z') || (s >= '0' && s <= '9')) return 1; return 0; } int main(void) { char str[] = "this!234$#&@#$^is5@#$a#@$4677~=_?}valid2234kjstring"; int len = strlen(str); int i, j=0; char *newstr1 = NULL; char *newstr2 = NULL; if ((newstr1 = (char *) malloc(sizeof(char) * len + 1)) == NULL) { printf("unable to allocate memory \n"); return -1; } for (i=0 ; i<len ; i++) { if (isalnum(str[i])) { newstr1[j] = str[i]; j++; } } newstr1[j] = '\0'; if ((newstr2 = (char *) malloc(sizeof(char) * len + 1)) == NULL) { printf("unable to allocate memory \n"); return -1; } j=0; for (i=0 ; i<len ; i++) { if (isalnum_not_prefered(str[i])) { newstr2[j] = str[i]; j++; } } newstr2[j] = '\0'; printf("string : %s \n", str); printf("result1 : %s \n", newstr1); printf("result2 : %s \n", newstr2); free(newstr1); free(newstr2); return 0; } 中的字符串以C终止。因此,您填充的新字符串也应以\0
  2. 结尾
  3. \0'内存必须为malloc()'ed
  4. free()应该处理错误
  5. 此代码不可移植,因为它假定机器字符设置为malloc()。如果硬件支持其他一些字符集(比如ASCII),那么这可能无法按预期工作。
  6. 希望这有帮助!