我正在嘗試解決用數字替換字母的問題。用戶將輸入一個字串,如果有字母,我必須替換相應的數字,如果有* # -符號,我必須簡單地洗掉它們。
但是,我面臨一個問題。當用戶只鍵入一個數字字串時,該字串的最后一個字符將被洗掉,這是不可能發生的。只有在字串中有字母或符號時才會發生這種情況。
來源
#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
輸出:33376786
問題:
輸入:190
輸出:19
uj5u.com熱心網友回復:
通過“慷慨”的掃描,即實際上沒有預期的語法,您可以在掃描成功時簡單地回圈。
while (1==scanf(" )9[^\n]", phrase)) alterChars(phrase);
這解決了您的 while 條件問題(請參閱為什么“while (!feof (file))”總是錯誤的?)。
然后你想讀取每一行,直到換行符或終止符:
for (i = 0; phrase[i] != '\0' && phrase[i] != '\n'; i )
并且您想針對破折號強制終止。
phrase[strlen(phrase)-dashes] = '\0';
并且您獲得所需的輸出-并且僅在一行中.... ;-)
解釋是,如果你總是以 1 個破折號終止,那么它適用于 1 個破折號,由于為零破折號切割太多而失敗,并且為多個破折號做其他不需要的東西,即重復最后幾個字符。
畢竟它與“僅數字”無關。
我已經合并了 chux 的這個很好的輸入:
scanf(" %[^\n]s"很糟糕,因為它沒有寬度限制,并且 2) s 毫無意義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/379857.html
下一篇:C程式不執行main中的所有指令
