【问题标题】:Last character of numeric string being removed, how to fix this problem in C?数字字符串的最后一个字符被删除,如何在 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

【问题讨论】:

  • 请不要假设非英语页面向 StackOverflow 用户提供信息。
  • 无法重现,对于输入“333-PORTO”,我在两行中得到输出“33376786 3337678”。不是规定的输出。因此问题与描述的不同。请仔细检查。
  • 语句phrase[strlen(phrase)-1] = '\0'; 将删除最后 1 个字符,无论破折号的数量如何(或表现出未定义的行为,即错误,如果strlen(phrase)==0)。你想要phrase[i - dashes] = '\0'。此外,这是主观的,但我认为所有这些 ifs 的各种字母都会更清楚地作为一个 switch 声明。

标签: c string


【解决方案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?
猜你喜欢
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 2016-10-11
  • 2011-04-14
  • 2011-01-19
  • 2016-10-04
  • 2011-12-15
相关资源
最近更新 更多