我有一個格式爲:[email protected] [email protected] ... [email protected]
的輸入字符串。它總是由'@'
和' '
分隔。根據條件從字符串中提取子字符串
實施例:
[email protected] [email protected] [email protected]
它應該顯示具有最小值的人的姓名。
如何解決?
輸出:
driver
我有一個格式爲:[email protected] [email protected] ... [email protected]
的輸入字符串。它總是由'@'
和' '
分隔。根據條件從字符串中提取子字符串
實施例:
[email protected] [email protected] [email protected]
它應該顯示具有最小值的人的姓名。
如何解決?
輸出:
driver
您可以結合使用strtok
和sscanf
函數來解決您的問題。
首先,您必須使用' '
(空格)作爲分隔符來標記字符串,然後從每個標記中提取數字以查找具有最小編號的標記。每當您找到一個數字小於當前值的令牌時,從該令牌中提取名稱並存儲新的可能最小的數字。下面是一個例子:
#include <string.h>
#include <stdio.h>
#include <float.h>
int main() {
char str[] = "[email protected] [email protected] [email protected]";
char result[256] = { 0 };
char *token, *sep_ptr;
float value, min = FLT_MAX; /* set 'min' to the maximum of float */
/* tokenize 'str' and walk through the tokens */
for(token = strtok(str, " "); token != NULL; token = strtok(NULL, " ")) {
value = FLT_MAX;
/* process the current token if it contains a '@' character */
if(sep_ptr = strchr(token, '@')) {
sscanf(sep_ptr, "@%f", &value); /* extract value */
/* check if the new number is smaller than current 'min' */
if(value < min) {
strcpy(result, (*sep_ptr = '\0', token)); /* extract name */
min = value;
}
}
}
puts(result);
return 0;
}
代碼的(*sep_ptr = '\0', token)
部分上面簡單地替換'@'
字符執行復制從token
到result
之前空字符。 (所提到的表達式使用comma operator。)
下面的代碼實現一個getSubstrSmallestNumber()
函數,它使用strtok()
函數而變化的輸入緩衝器。如果你不希望你可以先複製字符串。改變輸入緩衝區的好處是,找到的子字符串不需要內存分配。 strtok()
寫入一個空終止符'\0'
,如果它被調用,則會找到指定的分隔符。
getSubstrSmallestNumber()
函數可以用特定的分隔符來調用,這裏是'@'
和' '
。每個號碼將被轉換成雙倍數,並且檢查它是否比以前小。如果它更小,相應的令牌將被保存。 while循環結束後(如果strtok()
未找到更多標記),將返回保存的標記(最小雙精度值)。
請注意,代碼沒有錯誤檢查這應該被認爲是實施以及。
的完整代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <float.h>
char* getSubstrSmallestNumber(char* input, char* numberDelimiter, char* strDelimiter)
{
char* tokenStr;
double minNumber = DBL_MAX;
char* minToken = NULL;
for (tokenStr = strtok(input, numberDelimiter);
tokenStr != NULL;
tokenStr = strtok(NULL, numberDelimiter))
{
char* numberStr = strtok(NULL, strDelimiter);
double number = strtod(numberStr, NULL);
if (number < minNumber)
{
minNumber = number;
minToken = tokenStr;
}
}
return minToken;
}
int main()
{
char input[] = "[email protected] [email protected] [email protected]";
printf("<%s>\n", getSubstrSmallestNumber(input, "@", " "));
return 0;
}
輸出:
<driver>
我把'<'
和'>'
串圍在printf()
調用顯示,getSubstrSmallestNumber()
返回的字符串實際上只是driver
,沒有什麼比如空間。
你可以使用strrok
可用的C字符串庫和解析浮點數,你可以使用atof
函數但atof函數seems to be unreliable in some cases,不過。在這種情況下,您可以根據自己的需求編寫自己的實現。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <float.h>
#define SIZE 1000
int main() {
char input[SIZE], smallest[SIZE], name[SIZE];
const char s[2] = "@";
char *token;
float val = FLT_MAX;
while(scanf("%s", input) != EOF) {
token = strtok(input, s);
strcpy(name, token);
token = strtok(NULL, s);
float curVal = atof(token);
if(curVal < val) {
val = curVal;
strcpy(smallest, name);
}
}
printf("Smallest value : %s\n", smallest);
return 0;
}
當我測試它似乎表明正確的輸出:
~/Documents/src : $ ./a.out
[email protected]
[email protected]
[email protected]
Smallest value : driver
希望幫助!
您需要更具體。你知道弦的數量嗎?這會輸入還是在字符串緩衝區中?定界符是否總是@?以前的字符串是否只包含字符? –
其實這個問題沒有指定我們需要計算的輸入數量,下面是問題的輸入,@是上面指定的每種情況的分隔符。 –
將主字符串分隔爲帶有分隔符「'''的子字符串,然後用分隔符」@「進一步分隔這些子字符串,該分隔符給出名稱和數字(在此處使用雙數組)。查找最高數字索引並顯示名稱數組中相應的名稱)。使用你自己的一段代碼來分隔使用分隔符。 此外,你甚至可以解決它,而不需要兩個數組(一個名稱和其他雙打)。這取決於你如何編寫代碼(時間vs空間) –