数字字符串的最后一个字符被删除,如何在 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'。此外,这是主观的,但我认为所有这些 ifs 的各种字母都会更清楚地作为一个 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 中解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除字符串最后一位&JAVA&Android&amp;AndroidStudio

c语言如何删除输出的最后的一个字符?

C语言如何把一个字符串转换成数字

C语言如何删除文本的最后一个字符

为啥应用 tranwrd 函数后最后一个字符被删除

C语言如何删除已输出字符的最后一个