[英]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.