C如何在一定长度或读取特定字符时停止扫描集
C how to make a scanset stop when at certain length or when reading specific char
我有一个由 3 部分(开始、中间、结束)组成的字符串。
中间部分封装在''
中,它总是包含一个或多个字符(可能是几百个)。
如果它超过 15 个字符,我只想存储这部分的前 15 个字符。否则,我只能存储整个部分。
char result1[16], result2[16];
char *str1 = "placeholder 'this is more than 15 chars' placeholder";
char *str2 = "placeholder 'this is less' placeholder";
sscanf(str1, "%*[^']'%15[^']'%*[^']", result1);
sscanf(str2, "%*[^']'%15[^']'%*[^']", result2);
printf("|%s|", result1);
printf("|%s|", result2);
//Expected output result1: "|this is more th|"
//Expected output result2: "|this is less|"
请记住,我对一个 sscanf
来处理这两种情况很感兴趣。
上面的例子可能看起来有效,但有时在 str2
的情况下,扫描集将继续吃掉所有 15 个字符,即使它已经满足其分隔符 '
.
有没有办法让扫描集仅在吃掉少于 15 个字符时才在其分隔符处停止?
考虑使用错误检查的更强大的替代方案。
char *get_middle(char *dest, size_t sz, const char *s) {
if (dest == NULL || sz == 0) return NULL;
char *first = strchr(s, '\'');
if (first == NULL) return NULL;
first++;
char *second = strchr(first, '\'');
if (second == NULL) return NULL;
size_t len = second - first;
if (len == 0) return NULL;
if (len >= sz) len = sz - 1;
dest[len] = 0;
return memcpy(dest, first, len);
}
我有一个由 3 部分(开始、中间、结束)组成的字符串。
中间部分封装在''
中,它总是包含一个或多个字符(可能是几百个)。
如果它超过 15 个字符,我只想存储这部分的前 15 个字符。否则,我只能存储整个部分。
char result1[16], result2[16];
char *str1 = "placeholder 'this is more than 15 chars' placeholder";
char *str2 = "placeholder 'this is less' placeholder";
sscanf(str1, "%*[^']'%15[^']'%*[^']", result1);
sscanf(str2, "%*[^']'%15[^']'%*[^']", result2);
printf("|%s|", result1);
printf("|%s|", result2);
//Expected output result1: "|this is more th|"
//Expected output result2: "|this is less|"
请记住,我对一个 sscanf
来处理这两种情况很感兴趣。
上面的例子可能看起来有效,但有时在 str2
的情况下,扫描集将继续吃掉所有 15 个字符,即使它已经满足其分隔符 '
.
有没有办法让扫描集仅在吃掉少于 15 个字符时才在其分隔符处停止?
考虑使用错误检查的更强大的替代方案。
char *get_middle(char *dest, size_t sz, const char *s) {
if (dest == NULL || sz == 0) return NULL;
char *first = strchr(s, '\'');
if (first == NULL) return NULL;
first++;
char *second = strchr(first, '\'');
if (second == NULL) return NULL;
size_t len = second - first;
if (len == 0) return NULL;
if (len >= sz) len = sz - 1;
dest[len] = 0;
return memcpy(dest, first, len);
}