我在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
后删除此换行符?
答案 0 :(得分:1)
fgets
使用输入数据后按下的缓冲区中的\n
字符。只需添加
txt[strcspn(txt,"\n")] = 0;
在fgets
之后,使用NUL终结符替换\n
末尾的txt
字符。在您的情况下,strcspn
function会计算txt
中的字符数,直到\n
个字符为止。如果未找到换行符,则返回txt
(strlen(txt)
)的长度。
顺便说一句,如果你想使用这个功能,你需要包括string.h
:
#include <string.h>
答案 1 :(得分:0)
您遇到的问题与fgets()
的行为方式有关。根据{{3}}
char *fgets(char *s, int size, FILE *stream);
fgets()
最多从size
读取一个少于stream
个字符的字符,并将它们存储到s
指向的缓冲区中。在EOF
或newline
之后,阅读会停止。如果读取newline
,则将其存储到缓冲区中。
因此,在输入\n
之后,它会读取并存储通过按 ENTER 生成的尾随txt
(换行符)。如果您不希望\n
中存在txt
,则需要在打印txt
的内容之前手动将其从输入缓冲区中删除。
您可以使用strchr()
或strcspn()
查找可能的 \n
,并将其替换为\0
(null
)解决你的问题。