从字节数组中扫描字符串

时间:2014-03-01 19:06:10

标签: c scanf

有没有办法使用scanf()从字节数组中扫描字符串?

即:在找到特定值之前扫描任意数量的字节,然后扫描后续字符串?

我遇到的主要问题是处理'\0'值。有没有办法让scanf()以受控方式绕过NUL终止符?

3 个答案:

答案 0 :(得分: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';

答案 1 :(得分:0)

您可以改为使用sscanf()

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

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

答案 2 :(得分: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);

一般意义上使用fscanf("%c")

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

嵌入式'\0'真的搞砸了scanf()家庭。小心使用 格式,但我建议您只使用fread()fgetc()

相关问题