从stdin读取行直到EOF并在测试后打印第一个字符的文本

时间:2016-12-14 18:02:15

标签: c stdin

我想交互式(我想)从标准输入读取一行直到EOF,但是如果第一行字符是'+',我想要打印每行之后再打印{{1 }}打印"OK"。我尝试了这段代码,但即使我输入的行的第一个字符等于"NOT OK",也会打印"NOT OK"

'+'

2 个答案:

答案 0 :(得分:2)

要通过fgets()阅读,最好将其作为独立函数处理@alk

以下建议的代码类似于OP&#39。一个关键的区别是测试fgets(buffer)是否读取'\n'

#include <math.h>
#include <stdio.h>
#define BUF_SIZE 10

char *readline_mardon(void) {
  char buffer[BUF_SIZE];
  size_t contentSize = 1;
  char *content = malloc(contentSize);
  if (content == NULL) {
    perror("Failed to allocate content");
    exit(1);
  }
  content[0] = '\0'; // make null-terminated
  while (fgets(buffer, sizeof buffer, stdin)) {
    size_t buffer_length = strlen(buffer);

    // more idiomatic code
    // Assign `content` after successful allocation detected
    size_t contentSize_new = contentSize + buffer_length;
    printf("%zu <%s>\n", buffer_length, buffer);
    char *content_new = realloc(content, contentSize_new);
    if (content_new == NULL) {
      perror("Failed to reallocate content");
      free(content);
      exit(2);
    }

    // memcpy faster than strcat as the end of the first part is known
    memcpy(content_new + contentSize - 1, buffer, buffer_length + 1);

    content = content_new;
    contentSize = contentSize_new;

    // look for \n
    if (buffer_length > 0 && buffer[buffer_length - 1] == '\n') {
      break;
    }
  }
  return content;
}

用法

char *s;
while((s = readline_mardon()) != NULL) {
  if (s[0]== '+')  {
    printf("OK\n");
  } else {
    printf("NOT OK\n");
  }
  free(s);
}

如果没有被读取或发生输入错误,其他代码可能会返回NULL

答案 1 :(得分:1)

您正在将缓冲区连接到内容

strcat(content, buffer);

因此,对于第一个输入,假设&#34; abc&#34; content abc ,并且打印不正常。 对于第二个输入,假设&#34; + xyz&#34; content abc + xyz ,因此content[0]的值始终为&#34; a&#34; ,因此它将始终打印不行。

同样,如果您的第一个输入是&#34; + abc&#34; ,然后它将始终为所有输入打印OK。

使用strcpy而不是strcat

strcpy(content, buffer);