2015-10-20 56 views
1

我正在學習C文件操作,並且我有一個特定的問題,我需要將字母(A-Z,a-z)存儲爲從文件中讀取的字符串。所以,如果我有abcd&*dvcd那麼abcd是一個字符串,而dvcd是一個字符串。如何使用fscanf跳過文件中的東西?

基本上我有兩個問題:

  1. 我不知道前手來存儲字符串的大小。
  2. 我需要使用的fscanf格式字符串跳過非字母字符

我想我會解決這兩個。這是我的想法。我需要以某種方式跳過使用fscanf格式字符串來查找我在文件中的位置。然後,我可以從保存的起始位置減去找到我需要的字符串malloc。然後,我將具有特定長度的字符串,然後,我可以回到保存的位置並實際讀取它。

但是,我不知道如何告知fscanf不存儲掃描的字符串?

或者如果有另一種方法可以跳過非字母字符?

+1

你應該看看['fscanf()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fscanf.html) 上的POSIX文檔,看看它是否可用 - 諸如'%ms'中使用的'm'修飾符之類的特性有很多幫助。你應該看'掃描集'('%[...]')和'*'來壓制分配。更重要的是,您應該查看標準C ['fgets()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fgets.html)或POSIX ['getline()']( http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html)與'sscanf()'結合使用。它通常更容易。 –

+0

@JonathanLeffler哦。你的意思是將文件中的字符串存儲在內存中?我不認爲這是可行的,因爲我將使用非常大的文本文件的程序... – 1729

+0

你還計劃在哪裏儲存它?它不需要使用比你打算做的更多的內存 - 如果你不幸的話,每個字符串可能多32字節。讀完並處理每一行後,您可以刪除字符串 - 否則會泄漏內存。 –

回答

0

您可以在fscanf格式說明符中使用格式說明符,如「%[a-zA-Z]」。 如同下面示例,

#include<stdio.h> 
int main() 
{ 
     char a[10]; 
     fscanf(stdin, "%[a-zA-Z]", a); 
     printf("%s\n",a); 
} 

在這個例子中它僅在標準輸入讀取字母。它跳過非字母字符。

0

由於@suresh」答案是not working for me(輸出應該是asd gddf,而不是asd asd),我已經寫了另一個版本,這是不一樣短,但對我來說工作得很好:

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

int main(void) { 
    char ch; 
    while(scanf("%1c", &ch) == 1) { //while we have characters to read 
     if(isalpha(ch)) { // if the next one is alphanumeric 
      ungetc(ch, stdin); // we put it back 
      char str[101]; 
      scanf("%100[a-zA-Z]", str); // to read the whole string (including that char) 
      printf("found string %s\n", str); 
     } 
    } 
    return 0; 
} 

Here是工作ideone例子。我爲這個使用stdin,但是你可以很容易地使用它來使用你打開的另一個文件。我用於scanf%100[a-zA-Z]])的格式說明符表示它應該只讀取最多包含小寫或大寫字母的100個字符(str大小)。 %1c表示單個字符,並且unget將字符放回到緩衝區中以避免跳過它,如果它不是符號。

編輯:as @ m-m指出,在方括號內使用-不是標準的,在某些實現中可能不可用。如果它不適用於您,則始終可以使用%100[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]

+1

在內部使用'-''['是實現定義的;一些標準庫可能不支持您所依賴的行爲 –

相關問題