C 尝试验证新行是否存在后,新行删除不起作用
我正在编写一个代码来解析一些输入数据,并将其以特殊格式写入文件。我正在从每个字符串标记中删除换行符,如下所示:C 尝试验证新行是否存在后,新行删除不起作用,c,arrays,string,newline,C,Arrays,String,Newline,我正在编写一个代码来解析一些输入数据,并将其以特殊格式写入文件。我正在从每个字符串标记中删除换行符,如下所示: token[strlen(token)-2] ='\0' 它是-2,因为最后一个元素是\0。这很管用。但是,输入数据的最后一个元素没有换行符,因此仅使用换行符最终会从最后一个输入集中删除倒数第二个字符 original input: 0.38 after running it through the removal: 0.3 显而易见的解决方案是在删除之前检查换行符是否存在。我这样
token[strlen(token)-2] ='\0'
它是-2
,因为最后一个元素是\0
。这很管用。但是,输入数据的最后一个元素没有换行符,因此仅使用换行符最终会从最后一个输入集中删除倒数第二个字符
original input: 0.38
after running it through the removal: 0.3
显而易见的解决方案是在删除之前检查换行符是否存在。我这样做:
if(token[strlen(token)-2] =='\n') token[strlen(token)-2] ='\0';
但是,在添加if子句之后,换行符不再被删除!我做错了什么?从整个代码中删除:
while((token = strsep(&line, ",")) != NULL){
if(x++ == 1){
fwrite(" <item>\n", 11, 1, fw);
fwrite(" <name>", 14, 1, fw);
fwrite(token, strlen(token), 1, fw);
fwrite("</name>\n", 8, 1, fw);
}
else if(isdigit(token[0])) {
if(token[strlen(token)-2] =='\n') token[strlen(token)-2] ='\0';
fwrite(" <SPC>", 13, 1, fw);
fwrite(token, strlen(token), 1, fw);
fwrite("</SPC>\n", 7, 1, fw);
fwrite(" </item>\n", 12, 1, fw);
}
}
while((token=strep(&line,“,”)!=NULL){
如果(x++==1){
写入(“\n”,11,1,fw);
fwrite(“”,14,1,fw);
fwrite(令牌,strlen(令牌),1,fw);
写入(“\n”,8,1,fw);
}
else if(isdigit(令牌[0])){
如果(令牌[strlen(令牌)-2]=='\n')令牌[strlen(令牌)-2]='\0';
fwrite(“”,13,1,fw);
fwrite(令牌,strlen(令牌),1,fw);
写入(“\n”,7,1,fw);
写入(“\n”,12,1,fw);
}
}
您的换行符应该位于行[strlen(line)-1]
,但您可以在Windows下工作,其中换行符实际上由回车符和换行符组成。这可以解释为什么line[strlen(line)-2]='\0'
成功地删除了行尾,但测试失败。我认为您的问题是使用-2
而不是-1
,请使用此函数删除字符串右侧的空白:
#include <ctype.h>
/* remove whitespace from the right */
void rtrim(char *s) {
char *p;
for (p = s + strlen(s) - 1; p >= s && isspace(p[0]); p--);
p[1] = 0;
}
#包括
/*删除右侧的空白*/
void rtrim(字符*s){
char*p;
对于(p=s+strlen(s)-1;p>=s&&isspace(p[0]);p--);
p[1]=0;
}
或者,您可以使用strcspn():
或者,作为一个班轮:
token [ token + strcspn(token, "\r\n" )] = 0;
请注意,第一个片段仅删除尾随的“\r”和“\n”;srcspn()片段删除了它们遇到的第一个'\r'或'\n'中的所有内容。为了灵活性(无字符计数,无字符文本),我会:
乍一看问题是什么并不明显。也许您应该只使用
char*p=strchr(标记“\n”);如果(p)*p=0代码>?使用循环:for(len=strlen(token);len&&token[len-1]='\n';len--){token[len]=0;}
注意:这也可以扩展为缓存'\r'。在这种情况下,您应该添加这一点,OP应该在strlen(token)-2检查\r>\r>而不是\n
,我使用了-1
,但它没有删除任何换行符;当我个人使用-2
时,我会检查\r
和\n
并确保字符串足够长,可以同时包含这两个字符串。@elder4222但在Linux系统上会出现问题。如果您需要类似可移植性的东西,请从末尾检查\r
和\n
中的任何一种。
size_t len;
len = strcspn(token, "\r\n" );
token[len] = 0;
token [ token + strcspn(token, "\r\n" )] = 0;
#include <string.h>
...
char * rtrim(char * str, const char * del)
{
if (str)
{
char * pc;
while (pc = strpbrk(str, del))
{
*pc = 0;
}
}
return str;
}
...
char * line;
... /* let line point to some string */
/* to remove any kind of line end, call it like this: */
line = rtrim(line, "\n\r");
#define char wchar_t