2014-03-01 67 views
2

有沒有辦法使用scanf()從字節數組中掃描字符串?從字節數組中掃描字符串

即:在找到特定值之前掃描任意數量的字節,然後掃描後續字符串?

我遇到的主要問題是處理'\0'的值。有沒有辦法讓scanf()以受控方式繞過NUL終止符?

+1

Scanf僅用於掃描零終止的字符串。所以你不能跳過零終止符。請解釋你想要做什麼。 –

+2

你有沒有你嘗試過的例子?或者輸入的一些例子,以及預期的輸出? – Dabo

+0

@Michael Walz'scanf()',從'stdin'掃描,_can_掃描通過''\ 0''使用'scanf(「%[^ \ n]」,buf)'。這將接受輸入並保存,直到達到''\ n'',包括''\ 0''。一旦發生'\ n'',掃描就會停止('\ n''放回到'stdin'),並且一個''\ 0''被添加到'buf'。如果掃描了''\ 0',使用'strlen(buf)'可以減少結果。使用'scanf(「%[^ \ n]%n」,buf,&n)',代碼可以確定掃描的長度。在'stdin'中看到一個''\ 0''並不常見。 – chux

回答

0

爲什麼不只是遍歷字符串?

char str[30]; 
char str1[30]; 
char str2[30]; 
//Initialize str it to some string 

int i=0; 

while(str[i]!='x') //say scan till you find x 
{ 
    i++; 
} 
i++; 
memcpy(str1, str, i); //extract this substring till x 
str1[i+1]='\0'; 

int j=0; 
while(str[i]!='\0') //now copy the rest 
{ 
    j++; //track the point where x appeared 
    i++; 
} 

memcpy(str2, &str[i-j], j); //extract the rest 
str2[j+1]='\0'; 
0

您可以使用sscanf()代替:

char string[100] = "720 11 43"; 
int x, y, z; 

sscanf(string, "%d %d %d", &x, &y, &z); 
+0

不知道這是什麼問。 –

+0

@邁克爾瓦爾茲:人無法確定任何事情。這個問題不是很清楚。也許她甚至不知道她真正需要什麼。但她正在談論空字符,閱讀字符串和函數scanf()。讓我們拭目以待,看看這個答案是否讓**線**感到高興。 – pablo1977

0

不能使用sscanf()因爲sscanf()停止當達到'\0'字節數組做到這一點。 @Joseph Quinsey

如果代碼是從一個文件或stdin讀取,那麼有一個解決方案。

fscanf("%[^something]")fscanf("%c")都將掃描'\0'。即使fgets()也會掃描一個'\0'

OP:「在找到特定值之前掃描任意數量的字節,然後掃描後續字符串?」
以下將1)掃描任意數量的字節,直到找到x,2)掃描x,3)掃描空白和4)掃描並保存非空白區域。不幸的是,這最後一步將嵌入式'\0'視爲非空白區域。

ch ch; 
char buf[100]; 
if (1 == fscanf(inf, "%*[^x]x%99s", buf)) string_after_x_is_found(buf); 

要在一般意義上

FILE *inf; 
inf = fopen("something", "rb"); 
char ch; 
while (fscanf(inf,"%c", &ch) == 1) { 
    foo(ch); 
} 
fclose(inf); 

嵌入式'\0'使用fscanf("%c")真的攪亂scanf()家庭。謹慎使用格式可以工作,但我建議只用fread()fgetc()來代替。

+0

OP要求「從字節數組中掃描字符串」,而不是從「FILE *」中掃描。 –

+0

@Joseph Quinsey我用「scanf()從一個字節數組中掃描一個字符串」暗示使用'scanf()'_family_函數。 'scanf()'只能從'stdin'獲得輸入,所以掃描一個字符串意味着'sscanf()',這正如你所想的那樣 - 不是一個FILE,並且不適合掃描一個''\ 0''。 'fscanf()'和'scanf()'都可以用正確的指令掃描''\ 0''。儘管在stdin中看到一個''\ 0''雖然 - 通常是一個管道,這很棘手。 – chux