C语言 回文程序,允许用户选择是否要使用 do while 再次执行代码



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

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 palindromnn");
else
printf("nSträngen är inte ett palindromnn");
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] != '')
{
if(input_string[i] != ' ')
{
if(isalpha(input_string[i]))
{
rem_space[j++] = input_string[i];
}
}
i++;
}
rem_space[j] = '';
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: %sn", 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而不是scanf. 当您的数据具有定义良好的格式时,scanf很有用,而用户输入不是,因为用户会出错。通常,最好先将用户输入读入字符串,然后再对其进行解析。这是让它工作的一种方法:

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 palindromnn");
else
printf("nSträngen är inte ett palindromnn");
printf("Vill du köra igen? j/n: ");
if(fgets(str, 100, stdin) == NULL) {
// Handle error
}
} while(str[0] == 'j');
return 0;
}

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

最新更新