2011-01-26 65 views
0

我有一個簡單的問題。我想用C編寫一個掃描特定文件行的程序,如果行中唯一的短語是「Atoms」,我希望它停止掃描並報告它所在的行。這是我,而不是編譯,因爲很明顯,我比較的整數指針:循環直到找到特定的字符串

:(當然「string.h中」包括

char dm; 
    int test; 
    test = fscanf(inp,"%s", &dm); 

    while (test != EOF) { 
    if (dm=="Amit") { 
     printf("Found \"Atoms\" on line %d", j); 
     break; 
    } 
    j++; 
    } 

文件與已開通inp = fopen(..)

,並檢查以確保其正確打開...

我想,雖然使用不同的方法,並想知道如果它可以工作,而是掃描個體線,我可以掃描整個行作爲例如:

// char tt[200]; 
// 
// fgets(tt, 200, inp); 

,並完成類似:

if (tt[] == "Atoms") break;

謝謝! Amit

回答

2

不用太在意你的實際代碼在這裏,你所做的最重要的錯誤是==運算符不會比較兩個字符串。

在C中,一個字符串是一個字符數組,它只是一個指針。所以如果(「abcde」== some_string)永遠不會是真的,除非它們指向相同的字符串!

您想要使用像「strcmp(char * a,char * b)」這樣的方法,如果兩個字符串相等則返回0,否則返回其他值。 「strncmp(char * a,char * b,size_t n)」將比較a和b中的第一個「n」個字符,如果它們相等則返回0,這對於查看字符串的開頭是很好的如果一個字符串以某一組字符開始)

您也不應該在fscanf中傳遞字符作爲%s的指針!這會導致它徹底摧毀你的堆棧,它會嘗試將許多字符放入ch中,這隻能爲單個字符留出空間!正如James所說的,你想要做一些類似char ch [BUFSIZE]的BUFSIZE比單個行更大的字符,然後執行「fscanf(inp,」%s「,ch);」

希望有幫助!

+1

我似乎無法評論其他人的答案,但我想指出,約翰的建議是不好的。 在fscanf嘗試在那裏存儲數據之前,您必須初始化指向有效內存塊的指針!調用他在下面給出的代碼非常危險,因爲指針可能指向任何地方! – 2011-01-26 22:19:15

+0

謝謝@Kit。我結束了使用strncmp,這就是爲什麼我改變了你的答案。我認爲它對我的情況有用很多,我不知道這個strncmp函數。再次感謝。 – Amit 2011-01-27 02:50:01

+0

我很高興能幫上忙!我很抱歉,我的回答很羅嗦,但我試圖儘可能多地收集那些花絮。 – 2011-01-27 08:33:38

1

請注意,DM是一個字符,而您需要一個char *

更多:if (dm=="Amit")是錯誤的,它在

if (strcmp(dm, "Amit") == 0) 
1

使用的fscanf更改線路,您正在將字符串轉換爲char的地址。使用%S中的fscanf應該字符串設定爲一個指針,而不是地址:

char *dm; 
test = fscanf(inp,"%s", dm); 

的*符號聲明的間接,即通過可變DM指向。 fscanf行將聲明dm作爲對使用%s分隔符捕獲的字符串的引用。它將指向字符串中第一個字符的地址。

什麼樣的套件也是正確的,應該使用strcmp命令,而不是==比較,因爲==只會比較字符串的地址。

編輯:下面說什麼套件是正確的。所有指針在使用前都應該分配內存,否則應該轉換爲預先分配的內存空間。您可以像這樣分配內存:

dm = (char*)malloc(sizeof(char) * STRING_LENGTH); 

其中STRING_LENGTH是可能字符串的最大長度。這個內存分配只需要進行一次。

相關問題