2

入力データを解析し、特別なフォーマットでファイルに書き込むコードを作成しています。次のように、各文字列トークンから改行を削除しています。

token[strlen(token)-2] ='\0'

-2最後の要素が だからです\0。これだけ効きます。ただし、入力データの最後の要素には改行がないため、それを使用すると、最後の入力セットから最後から 2 番目の文字が削除されます。

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);
        }
    }
4

4 に答える 4

2
size_t len;
for(len=strlen(token); len && (token[len-1] == '\r' || token[len-1] == '\n'); len--) {
   token[len] = 0;
   }

または、strcspn() を使用できます。

size_t len;
len = strcspn(token, "\r\n" );
token[len] = 0;

または、ワンライナーとして:

token [ token + strcspn(token, "\r\n" )] = 0;

最初のフラグメントは末尾の '\r' と '\n'のみを削除することに注意してください。srcspn() フラグメントは、最初に遭遇した '\r' または '\n' からすべてを削除します。

于 2013-04-14T15:19:07.413 に答える
2

改行は にあるべきline[strlen(line)-1]ですが、実際には改行がキャリッジ リターンとそれに続く改行で構成される Windows で作業する場合があります。これline[strlen(line)-2]='\0'により、 が行末の削除に成功したのに、テストが失敗した理由が説明されます。

于 2013-04-14T15:14:37.737 に答える
2

-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;
} 
于 2013-04-14T15:16:36.810 に答える