我想寫一個演算法,該演算法的輸入包含某個物品的名稱和價格,以及它們之間的破折號。輸出應該是該物品的名稱和價格。 我還想知道如何將輸入分成兩個字串,一個是名稱,另一個是價格,因為我真的想不出任何辦法。
int getprice(char item[])。
void printitem(char item[] );
int main()
{
char item[40] 。
int i, j, len;
int price = 0;
fgets(item, 40, stdin) 。
price = getprice(item);
printitem(item)。
return 0;
}
int getprice(char item[])。
{
int i = 0;
int price = 0;
int len = strlen( item);
int temp;
for (i = 0; i < len; i )
{
if ((item[i] >= '0') && (item[i] <= '9')
{
break。
}
i ;
}
for (i; i < len; i )
{
temp = item[i] - '0'/span>;
price = price * 10;
price = price temp;
}
printf("price is: %u
", price)。)
return price。
}
void printitem(char item[])
{
int i = 0;
int len = strlen( item);
for (i = 0; i < len; i )
{
if (item[i] != '-'/span>)
{
printf("%c"/span>, item[i])。
}
else // if '-' is encountered the next char is checked if it stops or if it needs to keep going.
{
i ; //the for loop increases by itself {
if (item[i] == ' ') //如果'-'后面有一個空格,說明我們列印了整個內容。
{
break。
}
i--; //if it needs to keep going; }
printf("-"/span>)。
}
}
Input:Chocolate-Chip Cookie - 30。
輸出:專案。巧克力脆皮餅干
價格。30
實際輸出。專案。巧克力脆片餅干
價格。262 262
為什么輸出的價格是錯誤的,是否有更好的方法呢?
uj5u.com熱心網友回復:
好吧,馬上,我看到你在這個回圈中每次都會遞增i兩次,這可能不是你想要的:
for(i=0;i<len;i ) / <- First increment
{
if((item[i] >= '0') && (item[i] <= '9')
{
break。
}
i ; // <- Second increment。
}
這里的i是不必要的:
for(i;i<len;i )
//^不做任何事情。
你可以在你的價格計算回圈中列印一些值,看看發生了什么事:
for(i;i<len;i )
{
printf("price = %d, item[i] = %d, new price = %d
",
price, item[i], price * 10 (item[i] - '0'))。
temp = item[i] - '0';
price = price * 10;
price = price temp;
}
$ ./test
巧克力片餅干 - 300, item[i] = 51, new price = 3.
價格 = 3, item[i] = 48, new price = 30.
價格 = 30, item[i] = 10, 新價格 = 262 <-- Hmm
價格是。262 262
問題是,fgets正在添加。
(你在輸入后按下的回車鍵)到字串中,你把它解釋為價格的一部分。
uj5u.com熱心網友回復:
在我看來,這可以被簡化一些。為了清晰起見,省略了錯誤檢查,你可以這樣做:
結果:
Item: 'Chocolate-Chip Cookie'。
價格。'30'。
uj5u.com熱心網友回復:
為什么輸出價格不對?
代碼試圖改變"30
",而不是將"30"變成值30。
是否有一個更好的方法?
int getprice(const char *item){ // add const
//尋找一個非數字。
while ((*item < '0' || *item > '9') && *item) {
item ;
}
if (*item == 0) {
//沒有找到數字,可能會添加錯誤資訊。
return 0;
}
int prices=0;
while (*item >= '0' & & *item <= '9') { //Loop while a digit[/span].
price = price*10 (*item - '0') 。
item ;
}
printf("price is: %d
", price); // %d not %u
return price。
}
uj5u.com熱心網友回復:
另一種方法(你可以用來決議任何字串中的任何內容),是使用一對指標來walk-the-string在你想要的字串的每一段的開始和結束處設定一個開始和結束指標,然后將字串的這些部分復制到單獨的存盤中。
一個簡短的例子(帶注釋)是:
#include <stdio.h>
#include <string.h>
#define NUMC 32 /* 如果你需要一個常數,#define一個(或多個) */
#define MAXC 1024
#define DELIM " - "
int main (void) {
/* 讀取緩沖區,專案、價格和開始、結束指標的緩沖區 */
char buf[MAXC], item[MAXC], price[NUMC], *p_begin = buf, *p_end;
size_t len;
fputs ("input: ", stdout); /* prompt */; */
if (!fgets (buf, MAXC, stdin)) { /* read/validate input */
return 0;
}
if (! (p_end = strstr (buf, DELIM)) { /* locate start of delim */ /* locate start of delim */ (!
fputs ("ror: invalid input format.
", stderr)。)
return 1。
}
memcpy (item, p_begin, p_end - p_begin); /*拷貝專案 */
item[p_end - p_begin] = 0; /* nul-terminate item */.
p_begin = p_end strlen(DELIM); /* set begin to start of price */
len = strcspn (p_begin, "
"); /* 獲得價格的長度 */
memcpy (price, p_begin, len); /* 復制到價格 */
price[len] = 0; /* null-terminate price */
/* 輸出結果 */
printf ("
專案 : '%s'
價格。'%s'
", item, price)。)
}
使用/輸出示例
./bin/split_price-item
輸入。巧克力脆片餅干 - 30
Item : 'Chocolate-Chip Cookie'(巧克力餅干)
價格: '30'
現在,你的分隔符必須保持" - ",但你可以很容易地將其作為一個引數傳遞,而不是使用一個常數(取決于你)。如果你有任何問題,請告訴我。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/306942.html
標籤:
