簡體   English   中英

數字字符串的最后一個字符被刪除,如何解決 C 中的這個問題?

[英]Last character of numeric string being removed, how to fix this problem in C?

我正在嘗試解決用數字替換字母的問題。 用戶將輸入一個字符串,如果有字母,我必須替換相應的數字,如果有* # -符號,我必須簡單地將它們刪除。

但是,我面臨一個問題。 當用戶只鍵入一個數字字符串時,該字符串的最后一個字符將被刪除,這是不可能發生的。 僅當字符串中有字母或符號時才會發生這種情況。

資源

#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;
}

任何提示都會很有價值。 您可以訪問問題以查看錯誤發生的位置。 無論如何,它在最后一個條目上,編號 190。它正在打印 19,但實際上應該打印 190,因為只有在有字母或符號時才會刪除字符。

例子

輸入:333-PORTO
Output:33376786

問題:

輸入:190
Output:19

使用“大量”掃描,即幾乎沒有預期的語法,您可以在掃描成功時簡單地循環。

while (1==scanf(" %299[^\n]", phrase)) alterChars(phrase);

這解決了您的 while 條件問題(請參閱為什么“while (?feof (file))”總是錯誤的? )。

然后你想讀取每一行直到換行符或終止符:

for (i = 0; phrase[i] != '\0' && phrase[i] != '\n'; i++)

並且您想強制終止破折號。

phrase[strlen(phrase)-dashes] = '\0';

你得到了想要的 output - 並且只有一行.... ;-)

解釋是,如果您總是以 1 個破折號結束,那么它適用於 1 個破折號,由於對零破折號切割太多而失敗,並且對多個破折號執行其他不需要的東西,即重復最后幾個字符。
畢竟它與“僅限數字”無關。

我已經通過 chux 納入了這個很好的輸入:

scanf(" %[^\n]s"不好,因為它沒有寬度限制,並且 2) s 毫無意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM