c - 回文程序,让用户选择是否要再次执行代码或不使用 do while

标签 c do-while palindrome

对于一项学校作业,我需要创建一个程序,让用户输入一个应该存储在数组中的字符串。然后程序调用一个函数来删除数组中的所有空格。之后调用将所有字母变为小写的函数。之后调用第三个函数检查当前数组是否为回文,如果是则返回 1,否则返回 0。该程序运行良好。但是在我围绕让你输入数组并调用函数的代码做了一段时间之后,它似乎跳过了将输入放入数组的 scanf,基本上程序不允许我输入另一个要存储在数组中的字符串检查这是否是回文。目前我已经删除了代码中的 do while 但我必须实现它,有人可以帮助我吗?

int is_palindrome(char input_string[]);
void delete_spaces(char input_string[]);
void convert_to_lower(char input_string[]);

int main(void)
{
    char str[1000];
    char again;

    do {
        printf("Mata in en sträng: ");

        int i = 0;
        for (i = 0; i < 100; i++)
        {
            scanf("%c", &str[i]);
            if(str[i]=='\n')
            {
                break;
            }
        }

        delete_spaces(str);
        convert_to_lower(str);
        int palindrom_or_nah = is_palindrome(str);

        if(palindrom_or_nah == 1)
            printf("\nSträngen är ett palindrom\n\n");
        else
            printf("\nSträngen är inte ett palindrom\n\n");

            printf("Vill du köra igen? j/n: ");
            scanf(" %c", &again);
    }while(again == 'j');
    return 0;
}

//Kolla ifall strängen är ett palindrom
int is_palindrome(char input_string[])
{
    int answer = 0, i = 0;
    int h = (unsigned)strlen(input_string)-1;

    while(h>1)
    {
        if(input_string[i++] != input_string[h--])
        {
            break;
        }
        else
        {
            answer = 1;
        }
    }
    return answer;
}

//Ta bort mellanslag och andra tecken i strängen
void delete_spaces(char input_string[])
{
    int i = 0, j = 0;
    char rem_space[strlen(input_string)];

    while(input_string[i] != '\0')
    {
        if(input_string[i] != ' ')
        {
            if(isalpha(input_string[i]))
            {
                rem_space[j++] = input_string[i];
            }
        }
        i++;
    }
    rem_space[j] = '\0';

    for(i = 0; i < strlen(input_string); i++)
    {
        input_string[i] = rem_space[i];
    }

}

//Gör alla bokstäver till små bokstäver
void convert_to_lower(char input_string[])
{
    int count = (unsigned)strlen(input_string), i;

    for (i = 0; i < count; i++)
    {
        input_string[i] = tolower(input_string[i]);
    }
}

最佳答案

插入一个简单的打印输出会给你一个很好的线索。这样做:

if(str[i]=='\n')
{
    printf("Read the string: %s\n", str);
    break;
}

当我运行这段代码时,我得到了这个:

$ ./a.out 
Mata in en sträng: asdf
Read the string: asdf


Strängen är inte ett palindrom

Vill du köra igen? j/n: j
Mata in en sträng: Read the string: 
sdf

Strängen är inte ett palindrom

Vill du köra igen? j/n: j
Mata in en sträng: Read the string: 
df

Strängen är inte ett palindrom

Vill du köra igen? j/n: j
Mata in en sträng: Read the string: 
f

Strängen är inte ett palindrom

Vill du köra igen? j/n: j
Mata in en sträng: Read the string: 


Strängen är inte ett palindrom

Vill du köra igen? j/n: j
Mata in en sträng: Read the string: 


Strängen är inte ett palindrom

Vill du köra igen? j/n: 

问题是输入缓冲区没有清空。解决此问题的一个好方法是使用 fgets 而不是 scanfscanf 在您拥有定义明确的格式的数据时很有用,而用户输入不是这样,因为用户会犯错。处理用户输入的最佳方式通常是先将其读入字符串,然后再对其进行解析。这是让它工作的一种方法:

int main(void)
{
    char str[1000];

    do {
        printf("Mata in en sträng: ");
        int i = 0;

        if(fgets(str, 100, stdin) == NULL) {
            // Handle this error
        }

        delete_spaces(str);
        convert_to_lower(str);
        int palindrom_or_nah = is_palindrome(str);

        if(palindrom_or_nah == 1)
            printf("\nSträngen är ett palindrom\n\n");
        else
            printf("\nSträngen är inte ett palindrom\n\n");

            printf("Vill du köra igen? j/n: ");
            if(fgets(str, 100, stdin) == NULL) {
                // Handle error
            }
    } while(str[0] == 'j');
    return 0;
}

请记住,对于 scanffgets,您应该始终检查返回值是否有错误。

关于c - 回文程序,让用户选择是否要再次执行代码或不使用 do while,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52592528/

相关文章:

c++ - 在 C/C++ 中使用 ProtoBuf 进行深度复制

C 如何使用异步readFile

c++ - realloc() 的性能消耗

java - Java 中 Do .. While + Error 内的大小写切换

c++ - 这个 `do..while` 循环不工作

c - 在 C 中打印时得到 ╠

c - 为什么 gcc 在 cmd 行 (-D) 中重新定义 malloc() 时不检查函数的隐式声明?

javascript - JavaScript 问题(可能是 Math.floor(Math.random() 或 do-while)

C程序检查字符串是否为回文

Java - 垂直整数和回文