正在接受 \r\n 输入 C 程序
Accepting \r\n input C program
请问如何接受\r\n
不改成\r\n
,withfgets
.
我希望程序将 \r\n
转换为换行符而不是将其打印为字符串。
当前代码:
char buff[1024];
printf("Msg for server: ");
memset(buff, 0, sizeof(buff));
fgets(buff, sizeof(buff), stdin);
printf(buff);
输入:
test\r\ntest2
我想要的输出:
test
test2
我当前的输出:
test\r\ntest2
[编辑] 我现在怀疑 OP 正在输入 \ r \ n而不是回车return换行.
我会留下下面的内容供参考。
在fgets()
之后,使用strcspn())
if (fgets(buff, sizeof buff, stdin)) {
buff[strcspn(buff, "\n\r")] = '[=10=]'; // truncate string at the first of \n or \r
puts(buff); // Print with an appended \n
}
OP 正在输入
\ r \ n 和希望更改为换行。
处理输入字符串以查找 \
,转义序列的开始。
if (fgets(buff, sizeof buff, stdin)) {
char *s = buff;
while (*s) {
char ch = *s++;
if (ch == '\') {
switch (*s++) {
case 'r': ch = '\r'; break; // or skip printing this character with `continue;`
case 'n': ch = '\n'; break;
case '\': ch = '\'; break; // To print a single \
default: TBD(); // More code to handle other escape sequences.
}
}
putchar(ch);
}
您需要用换行符替换 de \r\n
子字符串:
#include <stdio.h>
#include <string.h>
int main(void)
{
char buff[1024];
printf("Msg for server: ");
fgets(buff, sizeof(buff), stdin);
char *substr = strstr(buff, "\r\n"); //finds the substring \r\n
*substr = '\n'; //places a newline at its beginning
while(*(++substr + 3) != '[=10=]'){ //copies the rest of the string back 3 spaces
*substr = substr[3];
}
substr[-1] = '[=10=]'; // terminates the string, let's also remove de \n at the end
puts(buff);
}
输出:
test
test2
此解决方案将允许您在主字符串中使用其他 \
个字符或 "\n"
和 "\r"
分隔的子字符串,如果这是一个问题,将仅替换该特定子字符串, 其他一切保持不变。
在您输入的字符串中,“\r”有两个字符:'\' & 'r'。但 '\r' 是单个字符。 “\r\n”是一个 4 字节的字符串,而“\r\n”是一个 2 字节的字符串。
如果你必须这样做,在gets之前写一个字符串替换函数
请问如何接受\r\n
不改成\r\n
,withfgets
.
我希望程序将 \r\n
转换为换行符而不是将其打印为字符串。
当前代码:
char buff[1024];
printf("Msg for server: ");
memset(buff, 0, sizeof(buff));
fgets(buff, sizeof(buff), stdin);
printf(buff);
输入:
test\r\ntest2
我想要的输出:
test
test2
我当前的输出:
test\r\ntest2
[编辑] 我现在怀疑 OP 正在输入 \ r \ n而不是回车return换行.
我会留下下面的内容供参考。
在fgets()
之后,使用strcspn())
if (fgets(buff, sizeof buff, stdin)) {
buff[strcspn(buff, "\n\r")] = '[=10=]'; // truncate string at the first of \n or \r
puts(buff); // Print with an appended \n
}
OP 正在输入
\ r \ n 和希望更改为换行。
处理输入字符串以查找 \
,转义序列的开始。
if (fgets(buff, sizeof buff, stdin)) {
char *s = buff;
while (*s) {
char ch = *s++;
if (ch == '\') {
switch (*s++) {
case 'r': ch = '\r'; break; // or skip printing this character with `continue;`
case 'n': ch = '\n'; break;
case '\': ch = '\'; break; // To print a single \
default: TBD(); // More code to handle other escape sequences.
}
}
putchar(ch);
}
您需要用换行符替换 de \r\n
子字符串:
#include <stdio.h>
#include <string.h>
int main(void)
{
char buff[1024];
printf("Msg for server: ");
fgets(buff, sizeof(buff), stdin);
char *substr = strstr(buff, "\r\n"); //finds the substring \r\n
*substr = '\n'; //places a newline at its beginning
while(*(++substr + 3) != '[=10=]'){ //copies the rest of the string back 3 spaces
*substr = substr[3];
}
substr[-1] = '[=10=]'; // terminates the string, let's also remove de \n at the end
puts(buff);
}
输出:
test
test2
此解决方案将允许您在主字符串中使用其他 \
个字符或 "\n"
和 "\r"
分隔的子字符串,如果这是一个问题,将仅替换该特定子字符串, 其他一切保持不变。
在您输入的字符串中,“\r”有两个字符:'\' & 'r'。但 '\r' 是单个字符。 “\r\n”是一个 4 字节的字符串,而“\r\n”是一个 2 字节的字符串。
如果你必须这样做,在gets之前写一个字符串替换函数