C中不需要的换行符

时间:2015-05-08 09:32:38

标签: c linux printf newline fgets

我在C中创建了一个在Linux控制台中显示文本的小脚本,但我发现了一个问题 - 脚本在文本末尾添加了一个换行符。我不明白为什么,通常我应该在/n之后换行。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char buf[1024];
    char txt[100];
    printf("Insert a text: ");
    fgets(txt, 100, stdin);
    snprintf(buf, sizeof(buf), "echo '%s'", txt);
    system(buf);
}

代码的结构必须保持不变。我需要使用系统函数和snprintf()

我想说清楚一些事情。当我运行此脚本时,输出如下所示:

root@test:/home# ./app
Insert a text: Hello
Hello

root@test:/home#

如何在Hello后删除此换行符?

2 个答案:

答案 0 :(得分:1)

fgets使用输入数据后按下的缓冲区中的\n字符。只需添加

txt[strcspn(txt,"\n")] = 0;

fgets之后,使用NUL终结符替换\n末尾的txt字符。在您的情况下,strcspn function会计算txt中的字符数,直到\n个字符为止。如果未找到换行符,则返回txtstrlen(txt))的长度。

顺便说一句,如果你想使用这个功能,你需要包括string.h

#include <string.h>

答案 1 :(得分:0)

您遇到的问题与fgets()的行为方式有关。根据{{​​3}}

  

char *fgets(char *s, int size, FILE *stream);

     

fgets()最多从size读取一个少于stream个字符的字符,并将它们存储到s指向的缓冲区中。在EOFnewline之后,阅读会停止。如果读取newline,则将其存储到缓冲区中。

因此,在输入\n之后,它会读取并存储通过按 ENTER 生成的尾随txt(换行符)。如果您不希望\n中存在txt,则需要在打印txt的内容之前手动将其从输入缓冲区中删除。

您可以使用strchr()strcspn()查找可能的 \n,并将其替换为\0null)解决你的问题。