只使用stdio.h,string.h和stdlib.h库我将如何实现它?
我对编程很陌生,所以请耐心等待我!
答案 0 :(得分:3)
char
数组。说服自己这是足够的空间。不要忘记NUL。<ctype.h>
并使用该标题中的函数/宏,则无法移植,除非您要枚举您认为是字母数字的所有字符。答案 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()
注意事项:
#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
\0
'内存必须为malloc()
'ed free()
应该处理错误malloc()
。如果硬件支持其他一些字符集(比如ASCII
),那么这可能无法按预期工作。希望这有帮助!