1

文字列の前と最後の二重引用符を削除するプログラムをANSICで作成したので、次のよう"Hello, world"になりHello, worldます。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* removeQuotes(char str[]) {
    int i = 1;
    int len = strlen(str) - 2;
    char * tmp = (char*) malloc (sizeof(char) * len);
    for (;i<=len;++i ) {
        tmp[i-1] = str[i];
    }
    return tmp;
}

int main(void) {
    char str[] = "Hello, world";
    char * abc = removeQuotes(str);
    printf("Inside the quotes is: %s length: %d\n"
            "Original is: %s length: %d", abc, strlen(abc), str, strlen(str));
    return 0;
}

IDEOne(http://ideone.com/Iybuk)では、正しい答えが得られます。しかし、GCCは私に奇妙な何かを与えます:

U→┬↓ length: 22es is: ello, worlESSOR_↑
Original is: Hello, world length: 12

文字列にスペースが含まれている場合にのみ発生します。「Helloworld」などで問題なく動作します。それを正しく機能させるための堅牢な方法はありますか?

4

4 に答える 4

5
  • ヌルターミネータに十分なスペースが割り当てられていません。

  • 結果の最後にヌルターミネータを追加しません。

  • ソース文字列には実際には引用符が含まれていません。

于 2012-04-14T23:06:56.790 に答える
1

Cでは、文字列はnull文字で終了します。これは。を意味し'\0'ます。

で文字列を終了していませんremoveQuotes()。これは正しいバージョンです。

char* removeQuotes(char str[]) {
    int i = 1;
    int len = strlen(str) - 2;
    char * tmp = (char*) malloc (sizeof(char) * (len + 1));
    for (;i<=len;++i ) {
        tmp[i-1] = str[i];
    }
    tmp[len] = '\0';
    return tmp;
}

また、文字列には実際には引用符が含まれていなかったため、渡した文字列にremoveQuotes引用符が含まれているかどうかは確認されません。

于 2012-04-14T23:07:50.423 に答える
0

removeQuotes関数では、結果の文字列にメモリを割り当て不足にし、バッファを超えて余分な文字を書き込みます。

文字列"Hello world"には実際には引用符は含まれていません。あなたは"\"Hello world\""あなたが念頭に置いていた文字列を持っているようにそれを宣言しなければならないでしょう。いずれの場合も、引用符を削除した結果の文字列は、入力文字列と同じ文字数になります。最初の文字はコピーしないため失われ、最後の文字はバッファを超えて書き込まれます(引用符であったとしても、メモリを破壊してそこに書き込まれます。

とにかくこれを行う必要があるのはなぜですか?C文字列は、文字配列の最初と最後の位置に引用符を使用して作成されると思いますか?

于 2012-04-14T23:05:25.593 に答える
0

一時文字列に「\0」を保持します。そうしないと、それが文字列であることがわかりません。

于 2012-04-14T23:08:06.687 に答える