有没有办法使用scanf()
从字节数组中扫描字符串?
即:在找到特定值之前扫描任意数量的字节,然后扫描后续字符串?
我遇到的主要问题是处理'\0'
值。有没有办法让scanf()
以受控方式绕过NUL
终止符?
答案 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()
。