从C

时间:2016-02-22 21:33:18

标签: c string char

我正在编写一些代码,它将字符串作为参数并使字母字符小写,删除数字(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];
    } */
}

我的第一个问题是我是否正确删除字符串中的数字?我的另一个问题是如何摆脱除撇号之外的所有标点符号?我注释掉了我尝试过的一些代码,因为它会阻止我的其余代码正常运行。

4 个答案:

答案 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;