通过scanf输入字符串

我想问是否有通过scanf在字符串中输入空白的方法,我使用这个[^ \ n]来输入所有排除换行的内容。它是否正确?但是它创建了很多问题,因为它似乎存储在输入缓冲区。什么是输入字符串的最佳方式.both gets和fgets会产生很多问题,

while(strcmp(buf,"quit")) { scanf("%*[^\n]",buf); n=send(connected,buf,strlen(buf),0); if(n<0) { perror("send"); printf("error sending"); exit(1); } //printf("server has send\n"); n=recv(connected,buf,100,0); if(n<0) { perror("recv"); printf("error recieving"); exit(1); } //printf("waiting to recieve something\n"); buf[n]='\0'; printf("client:%s\n",buf); } 

这是创造无限循环同样的事情一次又一次地重复。

如果您遇到的所有问题都是空行,请使用strcmp("\n", buffer) == 0

您发布的正则表达式将无法正常工作,因为C会将"%*[^\n]"'\n'字符转换为文字换行符。 为了让它更好地工作,你需要改变斜线: "%*[^ \ \n]"

然而,似乎麻烦也在于阅读,我建议你使用更好的function。

我之前使用过以下代码从文件中读取任意大小的连续行。

但是几个笔记:

  1. 完成后,返回的缓冲区需要是free() d
  2. 代码每次迭代浪费几个字节,但这并不是很明显,除非BUFFER_SIZE与行的长度相比非常小。

但是,代码保证从FILE *读取一个完整的行,它将以’\ n’结尾。

 /* * Initial size of the read buffer */ #define DEFAULT_BUFFER 1024 /* * Standard boolean type definition */ typedef enum{ false = 0, true = 1 }bool; /* * Flags errors in pointer returning functions */ bool has_err = false; /* * Reads the next line of text from file and returns it. * The line must be free()d afterwards. * * This function will segfault on binary data. */ char *readLine(FILE *file){ char *buffer = NULL; char *tmp_buf = NULL; bool line_read = false; int iteration = 0; int offset = 0; if(file == NULL){ fprintf(stderr, "readLine: NULL file pointer passed!\n"); has_err = true; return NULL; } while(!line_read){ if((tmp_buf = malloc(DEFAULT_BUFFER)) == NULL){ fprintf(stderr, "readLine: Unable to allocate temporary buffer!\n"); if(buffer != NULL) free(buffer); has_err = true; return NULL; } if(fgets(tmp_buf, DEFAULT_BUFFER, file) == NULL){ free(tmp_buf); break; } if(tmp_buf[strlen(tmp_buf) - 1] == '\n') /* we have an end of line */ line_read = true; offset = DEFAULT_BUFFER * (iteration + 1); if((buffer = realloc(buffer, offset)) == NULL){ fprintf(stderr, "readLine: Unable to reallocate buffer!\n"); free(tmp_buf); has_err = true; return NULL; } offset = DEFAULT_BUFFER * iteration - iteration; if(memcpy(buffer + offset, tmp_buf, DEFAULT_BUFFER) == NULL){ fprintf(stderr, "readLine: Cannot copy to buffer\n"); free(tmp_buf); if(buffer != NULL) free(buffer); has_err = true; return NULL; } free(tmp_buf); iteration++; } return buffer; } 

读取输入线的更好方法是

 char line[128]; /* Or whatever. */ while(fgets(stdin, line, sizeof line) != NULL) { /* Filter out whitespace before checking tokens. */ } 

如果您的开发环境支持,您也可以使用getline()

scanf("%*[^\n]",buf);有两个问题scanf("%*[^\n]",buf);

  1. 说明符中的星号会导致值被扫描,但不会被存储。
  2. 它会扫描到下一个换行符,但不会消耗该字符。 这意味着第一个之后的每个电话都不会读。

我认为您正在寻找的scanf是:

scanf(“%[^ \ n]%* c”,buf);

%[^ \ n]获取您的字符串,%* c忽略换行符。

但是,如果你谷歌“如何不读取c中的字符串”,这就是你得到的字面意思

非阻塞输入完全是另一回事。 你可能谷歌“cbreak模式”。 但是,这是一个unix-y终端的东西,如果你在Windows上,那可能没有意义。 X / Gtk / Qt将有其他方式来做这种事情。