【发布时间】:2022-01-16 09:21:42
【问题描述】:
我正在尝试解决用数字替换字母的问题。用户输入一个字符串,如果有字母,我必须替换相应的数字,如果有* # -符号,我必须简单地删除它们。
但是,我遇到了一个问题。当用户只键入一个数字字符串时,该字符串的最后一个字符将被删除,这是不可能发生的。仅当字符串中有字母或符号时才会发生这种情况。
来源
#include <stdio.h>
#include <string.h>
void alterChars(char phrase[])
{
int i, dashes = 0;
for (i = 0; phrase[i] != '\0'; i++)
{
if (phrase[i] == 'A' || phrase[i] == 'B' || phrase[i] == 'C')
{
phrase[i] = '2';
}
if (phrase[i] == 'D' || phrase[i] == 'E' || phrase[i] == 'F')
{
phrase[i] = '3';
}
if (phrase[i] == 'G' || phrase[i] == 'H' || phrase[i] == 'I')
{
phrase[i] = '4';
}
if (phrase[i] == 'J' || phrase[i] == 'K' || phrase[i] == 'L')
{
phrase[i] = '5';
}
if (phrase[i] == 'M' || phrase[i] == 'N' || phrase[i] == 'O')
{
phrase[i] = '6';
}
if (phrase[i] == 'P' || phrase[i] == 'Q' || phrase[i] == 'R' || phrase[i] == 'S')
{
phrase[i] = '7';
}
if (phrase[i] == 'T' || phrase[i] == 'U' || phrase[i] == 'V')
{
phrase[i] = '8';
}
if (phrase[i] == 'W' || phrase[i] == 'X' || phrase[i] == 'Y' || phrase[i] == 'Z')
{
phrase[i] = '9';
}
if (phrase[i] == '*' || phrase[i] == '#' || phrase[i] == '-')
{
dashes++;
}
else if (dashes > 0)
{
phrase[i - dashes] = phrase[i];
}
}
phrase[strlen(phrase)-1] = '\0';
printf("%s\n", phrase);
}
int main()
{
char phrase[300];
while (!feof(stdin))
{
scanf(" %[^\n]s", phrase);
alterChars(phrase);
}
return 0;
}
任何提示都会很有价值。您可以access the problem 查看错误发生的位置。无论如何,它在最后一个条目上,编号 190。它正在打印 19,但实际上应该打印 190,因为只有在有字母或符号时才会删除字符。
示例
输入:333-PORTO
输出:33376786
问题:
输入:190
输出:19
【问题讨论】:
-
请不要假设非英语页面向 StackOverflow 用户提供信息。
-
无法重现,对于输入“333-PORTO”,我在两行中得到输出“33376786 3337678”。不是规定的输出。因此问题与描述的不同。请仔细检查。
-
语句
phrase[strlen(phrase)-1] = '\0';将删除最后 1 个字符,无论破折号的数量如何(或表现出未定义的行为,即错误,如果strlen(phrase)==0)。你想要phrase[i - dashes] = '\0'。此外,这是主观的,但我认为所有这些ifs 的各种字母都会更清楚地作为一个switch声明。