数字字符串的最后一个字符被删除,如何在 C 中解决这个问题?
Posted
技术标签:
【中文标题】数字字符串的最后一个字符被删除,如何在 C 中解决这个问题?【英文标题】:Last character of numeric string being removed, how to fix this problem in C? 【发布时间】: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
【问题讨论】:
请不要假设非英语页面向 *** 用户提供信息。 无法重现,对于输入“333-PORTO”,我在两行中得到输出“33376786 3337678”。不是规定的输出。因此问题与描述的不同。请仔细检查。 语句phrase[strlen(phrase)-1] = '\0';
将删除最后 1 个字符,无论破折号的数量如何(或表现出未定义的行为,即错误,如果strlen(phrase)==0
)。你想要phrase[i - dashes] = '\0'
。此外,这是主观的,但我认为所有这些 if
s 的各种字母都会更清楚地作为一个 switch
声明。
【参考方案1】:
通过“大量”扫描,即几乎没有预期的语法,您可以在扫描成功时简单地循环。
while (1==scanf(" %299[^\n]", phrase)) alterChars(phrase);
这解决了您的 while 条件问题(请参阅Why is “while ( !feof (file) )” always wrong?)。
然后你想读取每一行直到换行符或终止符:
for (i = 0; phrase[i] != '\0' && phrase[i] != '\n'; i++)
你想强制终止破折号。
phrase[strlen(phrase)-dashes] = '\0';
然后你就得到了想要的输出——而且只有一行...... ;-)
解释是,如果你总是以 1 个破折号结束,那么它适用于 1 个破折号,由于对零破折号切割太多而失败,并且对多个破折号执行其他不需要的东西,即重复最后几个字符。 毕竟它与“仅限数字”无关。
我已将 chux 的这一良好意见纳入其中:
scanf(" %[^\n]s"
不好,因为它没有宽度限制,并且 2) s 毫无意义。
【讨论】:
这是有道理的。我想我在尝试从字符串中删除特殊字符时弄得一团糟。你能推荐我任何资源来修复它吗? 我在编辑、测试和改进后意识到,我现在非常接近@Perette 的评论。请相信我这是我自己的,或者接受佩雷特的功劳,佩雷特决定发表评论而不是回答。scanf(" %[^\n]s"
不好,因为它没有宽度限制,并且 2)s
毫无意义。
@chux-ReinstateMonica 好点。我会改进的。
@chux-ReinstateMonica Better?以上是关于数字字符串的最后一个字符被删除,如何在 C 中解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章