对于一项学校作业,我需要创建一个程序,让用户输入一个应该存储在数组中的字符串。然后程序调用一个函数来删除数组中的所有空格。之后调用将所有字母变为小写的函数。之后调用第三个函数检查当前数组是否为回文,如果是则返回 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
而不是 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 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;
}
请记住,对于 scanf
和 fgets
,您应该始终检查返回值是否有错误。
关于c - 回文程序,让用户选择是否要再次执行代码或不使用 do while,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52592528/