2016-02-28 55 views
1

我一直试图删除字符串末尾的新行。这是我一直在使用的。从char字符串中删除新行C++

char username[256]; 
recv(c->sock, username, sizeof username, 0); 
username[strlen(username)-1] = 0; 
c->SetName(username); 

这不适合我,因为char字符串被删除了一半。另一方面,如果我不试图删除用户名末尾的新行,我会得到没有问题的字符串。我已经尝试了很多方法,并且他们都得到了相同的结果。谢谢。

+0

_“字符串得到某种程度上删除了一半”_这还不清楚。你可以提供实际输入和实际输出吗? –

+0

如果用户名是gustavo,那么输出将是:tavo –

+0

http://stackoverflow.com/help/mcve –

回答

1

你不需要strlenrecv - 读取的字节recv返回数字。因此,你可以这样做

char username[256]; 
int n = recv(c->sock, username, sizeof(username) - 1, 0); // recv here leaves room for a null terminator 
if(n < 0) { 
    /* recv error: you should handle this since it probably means the socket is closed */ 
    exit(1); 
} 
username[n] = 0; // make sure that input is null-terminated 
if(n >= 1 && username[n-1] == '\n') 
    username[n-1] = 0; // strip newline 
setName(username); 
+0

我试过了,现在我什么也没有。我总是打印的用户名箭头头脑中,现在我得到这样的: <> 我得到这个之前: 铭记的是古斯塔沃是用户名 –

+0

我认为这个问题可能是你所得到'\ r \ n'(回车换行)。剥离'\ n'会留下一个空的'\ r',它可以清除输入行。 – nneonneo

+0

我应该尝试去除\ r然后去除\ n? –

2

问:您是否在套接字写入中发送'\ 0'C字符串分隔符?除非你这么做,否则“strlen()”将无法正常工作。

建议:检查在 “用户名” 字节的套接字读取后:

1)确保它实际上有 '\ n',

2)确保它有一个 '\ 0' C字符串分隔符,并确保它是您希望字符串结尾的位置。

可能的解决方案:

char username[256]; 
    int iret = recv(c->sock, username, sizeof username, 0); 
    if (iret < 0) { 
    <<handle error>> 
    } 
    if (username[iret-2] == 0x0d) { 
    username[iret-2] = 0; 
    } else if (username[iret-1] == '\n') { 
    username[iret-1] = 0; 
    } 
    ... 

请不要猜测。首先请看ACTUAL INPUT

请不要使用“strlen()”或任何类似的C字符串函数,直到确定字符串被分隔为止。要么是因为你发送了“0”,要么是因为你把它放在那里。

参见:

https://en.wikipedia.org/wiki/Newline

+0

我确定它有'\ n',但我不确定它是否具有'\ 0'分隔符。让我试试看。 –

+0

只需添加,在处理套接字时,更喜欢使用'strnlen' ... – WhiZTiM