021023 – sscanf không thể đọc chuỗi có độ dài bằng 0

lập trình


Đoạn mã sau:

C
#include <stdio.h>

int main(void) {
  char buf[80] = "salam";
  const char *fmt = "\"%79[^\"]\"";
  int n;

  n = sscanf("\"\"", fmt, buf);
  printf("%d fields were read. buf = '%s'\n", n, buf);
  n = sscanf("\"hamidi\"", fmt, buf);
  printf("%d fields were read. buf = '%s'\n", n, buf);
}

đầu ra:

0 trường đã được đọc. buf=”salam”
1 trường đã được đọc. buf=”hamidi”

Điều này cho biết hàm sscanf không thể đọc các chuỗi trống có chuỗi định dạng đã chỉ định. Có sự thay thế nào tốt cho chuỗi định dạng biểu thức chính quy để đọc các chuỗi có độ dài từ 0 đến tối đa 79 ký tự bằng hàm sscanf không? Nói cách khác, tôi mong đợi sscanf đầu tiên chèn ‘\0’ vào buf[0] và trả về 1 thay vì 0. Có cách nào không?

Những gì tôi đã thử:

Đây chỉ là một câu hỏi. Đó không phải là điều mà tôi phải thử làm gì đó.

Giải pháp 1

Một lựa chọn tốt hơn sẽ là sử dụng fget[^]. Nó bao gồm ký tự dòng mới được đọc nhưng có thể loại bỏ dễ dàng bằng chức năng như thế này:

C
void StripChar( char * buffer, int chr )
{
    char * p = strchr( buffer, chr );
    if( p )
       * p = 0;
}

Đây là một mẫu nhỏ:

C
#define BUFFER_SIZE 79
    char buffer[ BUFFER_SIZE + 1 ] = { 0 };
    fgets( buffer, BUFFER_SIZE, stdin );
    StripChar( buffer, '\n' );

コメント

タイトルとURLをコピーしました