首页 > 解决方案 > 我想从字符串中删除空格以检查它的palendrome,但它不断在C中添加字母

问题描述

我遇到的问题是代码在“for”代码之后不断添加字母,如果我写“ni pratar bra latin”,它将变成“nipratarbralatintin”,带有一个exta“tin”

    int ret1;
    int size = 0;
    int i = 0;
    char ch[100];


    printf("WELCOME USER\n");
    printf("ENTER A SENTENCE OR A WORD FOR THE PROGRAM TO START.\n");
    printf("THE PROGRAM WILL CHECK IF YOUR SENTENCE / WORD IS A PALENDROME");
    printf("\n");
    scanf(" %[^\n]s", &ch);

删除空格,也就是我遇到问题的部分

    for (i = 0, size = 0; i < strlen(ch); i++) {
        ch[i - size] = ch[i];
        if (ch[i] == ' ')
            size++;
    }
    ch[i] = '\0';

    ret1 = isPalindrome(ch);
    int quit;

    if (ret1 == 1)
        // 1 means string is palendrome
        printf("\nYOUR SENTENCE/WORD: %s IS A PALENDROME", ch);
    else if (ret1 == 0)
        // 0 means string is not palendrome
        printf("\nYOUR SENTENCE/WORD: %s IS NOT A PALENDROME", ch);

标签: cstring

解决方案


线

    ch[i] = '\0';

是错的。该行没有意义,因为它\0已经存在,ch[i]因为它是在使用条件退出循环之后i < strlen(ch)

该行应该是

   ch[i - size] = '\0';

保持与循环内行的一致性ch[i - size] = ch[i];

还有线

    scanf(" %[^\n]s", &ch);

是错误的,因为在预期char(*)[100]的地方传递并且调用了未定义的行为。char*

它应该是

    scanf(" %[^\n]s", ch);

没有多余的&

这个带有检查的版本更好:

   if (scanf(" %[^\n]s", &ch) != 1) {
       fputs("read error\n", stderr);
       /* exit program (return from main(), using exit(), etc. */
   }

推荐阅读