2013-05-27 54 views
0

我被困在我的家庭作業中。沒有急於,我有足夠的時間來完成這一點。我一直在漫遊論壇(看起來像一個論壇哈哈),並一直非常感謝這裏的社區的知識和意識。我已經從其他回答這些noob問題的人的恩典中應用了許多技術。C - 取一個字符串,並使用連字符分隔符解析/標記爲較小的字符串

無論如何,我的任務是編寫一個ac程序,該程序需要一個帶連字符的字符串,並檢查第一個字符串(在連字符之前)是否只有字母/字母,下一個組是僅數字,最後一組僅爲字母/字母。這是類似於這個項目:http://wps.aw.com/wps/media/objects/7257/7431666/Case_Studies/GaddisJavaCSO_CS6.pdf

到目前爲止,我堅持把字符串分成3個變量。我已閱讀有關的strtok和操縱scanf函數,但我一直沒成功:

#include <ctype.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
char serial [50]; 
char * part1 = NULL, part2 = NULL, part3 = NULL; 
    printf("Enter Serial Number:\n"); 
    scanf("%s", serial); 
part1 = strtok (serial, "-"); 

part2 = strtok(NULL, "-"); 
part3 = strtok(NULL, "-"); 

    printf("You entered %s\n", part1); 
    printf("You entered %s\n", part2); 
    printf("You entered %s\n", part3); 
return 0; 
} 
+0

'*'不是數據類型的一部分,我想你想寫'char * part1 = NULL,* part2 = NULL,* part3 = NULL;' – Johannes

回答

1

您使用strtok的錯誤,向它傳遞參數,它應該工作的罰款。

char * pch = strtok (serial, "-"); 
while (pch != NULL) 
{ 
    printf ("%s\n",pch); 
    pch = strtok (NULL, "-"); 
} 

或在您的例子中,你需要在每個定義爲一個char *:

char * part1= strtok (serial, "-"); 
    char * part2 = strtok(NULL, "-"); 
    char* part3 = strtok(NULL, "-") 

StrTok + example

+0

Dory Zidon - 你的strtok用於分裂第一組,但是我得到了第二/第三組不可移植的指針轉換錯誤。我究竟做錯了什麼? – Nixnexus

+0

@Nixneuxs - 你需要將每個poat定義爲一個char *,否則它是一個char而不是char * ...或者我如何在編輯的例子中顯示或者在每個var前面使用指針表示法。 –

+0

哇我現在感覺很愚蠢。非常感謝你Dory Zidon ... – Nixnexus

0
strcpy(part1, strtok(serial, "-"));//premise: string has hyphen 
strcpy(part2, strtok(NULL, "-")); 
strcpy(part3, strtok(NULL, "-")); 
0

你可以利用scanf的格式規則的直接讀取你的字符串輸入行。

#include <ctype.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char part1[40], part2[40], part3[40]; 
    int count, n; 
    do{ 
     n = 0; 
     flushall(); 
     printf("Enter Serial Number:\n"); 
     count = scanf(" %39[A-Za-z]-%39[0-9]-%39[A-Za-z]%n", part1, part2, part3, &n); 
     if(count != 3 || n == 0){ 
      printf("Recognize %i parts, %s\n", count, n == 0 ? "did not parse to the end" : "parsed to the end"); 
     } 
    }while(count != 3 || n == 0); 

    printf("You entered %s\n", part1); 
    printf("You entered %s\n", part2); 
    printf("You entered %s\n", part3); 
return 0; 
} 

這是相當嚴格的解析輸入形式,並要求用戶保留外部形式。您可以通過不使用%s而是像%[0-9]那樣容易地過濾允許的字符串。對我來說,過濾serialnumber輸入的最好方法是總是正則表達式,如果可用......但我不認爲這是你的功課的一部分:)

+0

這聽起來超級先進哈哈。看起來你定義了密鑰的每個部分有40個字符......非常感謝你的迴應,並給我一個未來任務的提示。我看到Regex在開始一個新線程之前提到了很多次試圖縮小答案 – Nixnexus

+0

限制字符串是一件安全事情。否則,您可能會溢出字符串緩衝區,因爲scanf無法測量char指針後面的緩衝區大小。您也可以使用它來限制零件的尺寸。如果你想用正則表達式來擺弄一下,你可以使用這樣一個在線正則表達式測試器:http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx – Johannes

相關問題