【问题标题】:Remove trailing newline character using fgets使用 fgets 删除尾随换行符
【发布时间】:2018-03-28 23:16:01
【问题描述】:

我正在编写一个程序来读取文件并确定一个单词是否是回文。我遇到了一个问题,即最后一个令牌有一个尾随换行符并且不会注册为回文。

这是文件输入:

leVel CompUtER Science theORY radar

这是我的代码:

#include<stdio.h>
#include<string.h>

void palindrome(char str[]){
  int length = strlen(str);
  int i = 0;
  int j = length - 1;
  for(i = 0; i < length; i++){
    if(str[i] != str[j]){
      printf("String %s is not a palindrome.\n", str);
      return;
    }
    j--;
  }
  printf("String %s is a palindrome.\n", str);
  return;
}



int main() {

  char line1[100];
  fgets(line1, 100, stdin);
  printf("%s", line1);

  char *token;
  token = strtok(line1, " ");

  while(token != NULL){
    printf("%s\n", token);
    palindrome(token);

    token = strtok(NULL, " ");
  }

感谢您的帮助!

【问题讨论】:

  • 使用" \n"广告分隔符,它也会去掉换行符。
  • @Pablo 有一个足够的答案,但是从缓冲区中修剪换行符和更多内容的可重用代码是 buffer[strcspn(buffer, "\r\n")] = 0;

标签: c token fgets


【解决方案1】:

如果你使用strtok,那么你可以使用" \n"作为分隔符,换行符会被处理。

int main() {

  char line1[100];
  fgets(line1, 100, stdin);
  printf("%s", line1);

  const char *delim = " \n";

  char *token;
  token = strtok(line1, delim);

  while(token != NULL){
    printf("%s\n", token);
    palindrome(token);

    token = strtok(NULL, delim);
  }

  ...

}

另一个删除换行符的好方法是像这样使用strcspn

char line[1024];
fgets(line, sizeof line, stdin);

line[strcspn(line, "\n")] = 0; // removing newline if one is found

【讨论】:

  • Thinking Windows,最好用:line[strcspn(line, "\r\n")] = 0;!
【解决方案2】:

为什么不直接使用 fgetc 并在换行符处停止呢?您甚至可以在字符串中找到换行符并将其分配 '\0',它就会消失。

【讨论】:

    猜你喜欢
    • 2022-01-05
    相关资源
    最近更新 更多