我正在编写一些代码,它将字符串作为参数并使字母字符小写,删除数字(012 ... 9),并删除除撇号之外的所有标点符号。到目前为止,这是我的代码:
void stripLower(char* str) {
int strLen = strlen(str);
char* temp[strLen];
char apos = (char)"39";
for(int i = 0; i < strLen; i++) {
if(isupper(str[i])){
str[i] = tolower(str[i]);
} else if(isdigit(str[i])) {
str[i] = (char)"0";
} else if(ispunct(str[i])){
/*if((strcmp(str[i], apos)) == 0){
} else {
str[i] = (char)"0";
}*/
}
}
/*for(int i = 0; i < strLen; i++){
str[i] = temp[i];
} */
}
我的第一个问题是我是否正确删除字符串中的数字?我的另一个问题是如何摆脱除撇号之外的所有标点符号?我注释掉了我尝试过的一些代码,因为它会阻止我的其余代码正常运行。
答案 0 :(得分:0)
此声明在多个级别上都是错误的。
char apos=(char)"39";
这将指定apos为指针值(因为C中的字符串文字的结果是const char *
),但是被截断以适合char
。编译器在添加演员表之前给出的警告(错误?)应该是该行错误的提示。
字符文字的C语法是单引号值。要转义'
字符,请使用反斜杠:
char apos = '\'';
然后,您可以将此值与直接相等(即==
)进行比较,而不是使用strcmp
,后者采用字符串,而不是char
。
虽然在这种情况下,我可能会完全忽略局部变量apos
并直接比较如下:
if((strcmp(str[i], '\'')) == 0){ /* your code here*/ }
或者,如果您不喜欢使用char文字,请使用宏(在这种情况下,我觉得这可能是不必要的混淆):
#define CHAR_APOS ('\'')
if((strcmp(str[i], '\'')) == 0){ /* your code here*/ }
答案 1 :(得分:0)
此
str[i] = (char)"0";
不会删除数字。
如果你的意思是将整个琴弦向左移动#34;去掉&#34;一个字符,下面的代码将满足您的目的
函数是a BSD licensed string processing library, called zString的一部分。
int zstring_search_chr(char *token,char s){
if (!token || s=='\0')
return 0;
for (;*token; token++)
if (*token == s)
return 1;
return 0;
}
char *zstring_remove_chr(char *str,char *bad) {
char *src = str , *dst = str;
while(*src)
if(zstring_search_chr(bad,*src))
*src++;
else
*dst++ = *src++; /* assign first, then incement */
*dst='\0';
return str;
}
一个用法示例
Example Usage
char s[]="this is a trial string to test the function.";
char *d=" .";
printf("%s\n",zstring_remove_chr(s,d));
Example Output
thisisatrialstringtotestthefunction
答案 2 :(得分:0)
你混淆了字符串和字符。字符文字包含在'
中。字符串文字包含在"
中,是一个字符数组。
e.g:
"This is a string literal"
'c' // this is character
例如,要测试char是否不是z
,您可以写:
char c = ...;
if (c == 'z')
对于特殊字符,例如'
,新行,制表符等,您必须像这样逃避它们:
char c1 = '\'' // this is a ' character
char c2 = '\t' // this is a tab character
strcpm
用于比较字符串。如果你想比较字符,==
就是你所需要的,正如我在上面所示。
您的功能可以简单地写成:
int strip(char* str)
{
int from, to;
for (from = 0, to = 0; str[from] != '\0'; ++from) {
if (!isdigit(str[from]) && (!ispunct(str[from]) || str[from] == '\'')) {
str[to] = tolower(str[from]);
++to;
}
}
str[to] = '\0';
}
示例输入和输出:
int main(void)
{
char str[] = "This is 'Sparta'! The 200. I ,think,";
strip(str);
printf("%s\n", str);
return 0;
}
输出:
this is 'sparta' the i think
答案 3 :(得分:0)
如前所述,您不能将字符串强制转换为字符。在这种情况下,我会这样做:
char apos = '\''; //a symbol between apostrophes is a character and between quotation marks is a string
或者如果您想使用与ASCII表中的符号对应的十进制数,您可以这样做:
char apos = 39;