fgets() 在字符串中包含新行
fgets() includes new line in string
我从我的文档中提取了单词,并将所有单词打印在屏幕上,但是在打印每个单词之后都有一个空行。如何避免读取或将这一新行添加到字符串中?
int main(void) {
FILE *f;
f = ("words", "r");
char string[100];
while (fgets(string, 100, f)) {
printf("%s", string);
}
}
这段代码不是复制粘贴的,所以我可能忘记了一些小片段,但应该可以。在 words.txt 中,我每行一个词。我的程序将它们全部打印到屏幕上,但在每个单词后添加一个新行。我不希望它添加新行或 space。因此,如果 txt 在一行上有 Hello
而在下一行有 Bye
,我希望它打印 HelloBye
。最终程序的 objective 不会打印字符串,而是将字符串用于其他用途,所以我确实需要一个只有文本而末尾没有 spaces 的字符串或换行。
试试这个。
int main()
{
FILE *f;
f = ("words", "r");
char string[100];
while (fgets(string, 100, f))
{
char * message = strtok(string, "\n");
printf("%s", message);
}
}
strtok
将字符串标记为 your message
、\n
。 fgets
将捕获 \n
令牌
按设计 fgets
读取一行(以 \n
结尾)并在行中保留 \n
- 提供缓冲区足够大了。看看最后一个字符是否是 \n
,是否将其替换为 [=15=]
,实际上将行的长度减少了一个:
int main(void)
{
FILE *f;
f = ("words", "r");
char string[100];
while (fgets(string, 100, f))
{
if ((string[0] != '[=10=]') && (string[strlen(string) -1] == `\n')) {
string[strlen(string) -1] = `[=10=]';
}
printf("%s", string);
}
}
您不能阻止 fgets()
将'\n'
存储在提供给它的数组的末尾。如果数组太短,fgets()
将不会存储换行符,它会将数组中放不下的字符留在输入流中,以供下一次输入操作读取。
有多种方法可以删除尾随换行符,可能存在也可能不存在:
使用strcspn()
:
#include <stdio.h>
#include <string.h>
int main(void) {
char string[100];
FILE *f = fopen("words", "r");
if (f != NULL) {
while (fgets(string, sizeof string, f)) {
string[strcspn(string, "\n")] = '[=10=]';
printf("%s", string);
}
}
return 0;
}
使用strlen()
:
#include <stdio.h>
#include <string.h>
int main(void) {
char string[100];
FILE *f = fopen("words", "r");
if (f != NULL) {
while (fgets(string, sizeof string, f)) {
size_t len = strlen(string);
if (len > 0 && string[len - 1] == '\n')
string[--len] = '[=11=]';
printf("%s", string);
}
}
return 0;
}
使用strchr()
:
#include <stdio.h>
#include <string.h>
int main(void) {
char string[100];
FILE *f = fopen("words", "r");
if (f != NULL) {
while (fgets(string, sizeof string, f)) {
char *p = strchr(string, "\n");
if (p != NULL)
*p = '[=12=]';
printf("%s", string);
}
}
return 0;
}
我从我的文档中提取了单词,并将所有单词打印在屏幕上,但是在打印每个单词之后都有一个空行。如何避免读取或将这一新行添加到字符串中?
int main(void) {
FILE *f;
f = ("words", "r");
char string[100];
while (fgets(string, 100, f)) {
printf("%s", string);
}
}
这段代码不是复制粘贴的,所以我可能忘记了一些小片段,但应该可以。在 words.txt 中,我每行一个词。我的程序将它们全部打印到屏幕上,但在每个单词后添加一个新行。我不希望它添加新行或 space。因此,如果 txt 在一行上有 Hello
而在下一行有 Bye
,我希望它打印 HelloBye
。最终程序的 objective 不会打印字符串,而是将字符串用于其他用途,所以我确实需要一个只有文本而末尾没有 spaces 的字符串或换行。
试试这个。
int main()
{
FILE *f;
f = ("words", "r");
char string[100];
while (fgets(string, 100, f))
{
char * message = strtok(string, "\n");
printf("%s", message);
}
}
strtok
将字符串标记为 your message
、\n
。 fgets
将捕获 \n
令牌
按设计 fgets
读取一行(以 \n
结尾)并在行中保留 \n
- 提供缓冲区足够大了。看看最后一个字符是否是 \n
,是否将其替换为 [=15=]
,实际上将行的长度减少了一个:
int main(void)
{
FILE *f;
f = ("words", "r");
char string[100];
while (fgets(string, 100, f))
{
if ((string[0] != '[=10=]') && (string[strlen(string) -1] == `\n')) {
string[strlen(string) -1] = `[=10=]';
}
printf("%s", string);
}
}
您不能阻止 fgets()
将'\n'
存储在提供给它的数组的末尾。如果数组太短,fgets()
将不会存储换行符,它会将数组中放不下的字符留在输入流中,以供下一次输入操作读取。
有多种方法可以删除尾随换行符,可能存在也可能不存在:
使用strcspn()
:
#include <stdio.h>
#include <string.h>
int main(void) {
char string[100];
FILE *f = fopen("words", "r");
if (f != NULL) {
while (fgets(string, sizeof string, f)) {
string[strcspn(string, "\n")] = '[=10=]';
printf("%s", string);
}
}
return 0;
}
使用strlen()
:
#include <stdio.h>
#include <string.h>
int main(void) {
char string[100];
FILE *f = fopen("words", "r");
if (f != NULL) {
while (fgets(string, sizeof string, f)) {
size_t len = strlen(string);
if (len > 0 && string[len - 1] == '\n')
string[--len] = '[=11=]';
printf("%s", string);
}
}
return 0;
}
使用strchr()
:
#include <stdio.h>
#include <string.h>
int main(void) {
char string[100];
FILE *f = fopen("words", "r");
if (f != NULL) {
while (fgets(string, sizeof string, f)) {
char *p = strchr(string, "\n");
if (p != NULL)
*p = '[=12=]';
printf("%s", string);
}
}
return 0;
}