我从我的文件中提取了所有文字并将其全部打印在屏幕上,但是在打印完每个文字后都有一个空行。如何避免在字符串中读取或添加这一新行?
int main(void) {
FILE *f;
f = ("words", "r");
char string[100];
while (fgets(string, 100, f)) {
printf("%s", string);
}
}
这段代码不是复制粘贴的,所以我本可以忘记一些小块但是应该可以工作。在words.txt中,每行都有一个单词。我的程序将它们全部打印到屏幕上,但在每个单词后添加一个新行。我不希望它添加新行或空格。因此,如果txt在一行上有Hello
而在下一行有Bye
,我希望它打印HelloBye
。最终程序的目标不是打印字符串,而是将字符串用于其他内容,因此我需要一个字符串,其中只有文本末尾没有空格或新行。
答案 0 :(得分:1)
按设计 fgets
读取一行(以\n
结尾)并将\n
保留在行中 - 前提是缓冲区足够大。只要查看最后一个字符是\n
,它是否用\0
替换它,实际上减少了一行的len:
int main(void)
{
FILE *f;
f = ("words", "r");
char string[100];
while (fgets(string, 100, f))
{
if ((string[0] != '\0') && (string[strlen(string) -1] == `\n')) {
string[strlen(string) -1] = `\0';
}
printf("%s", string);
}
}
答案 1 :(得分:0)
您不能防止 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")] = '\0';
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] = '\0';
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 = '\0';
printf("%s", string);
}
}
return 0;
}
答案 2 :(得分:-1)
试试这个。
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
令牌