0

新しい編集: 基本的に、正しくない例を提供しました。私の実際のアプリケーションでは、文字列はもちろん常に「C:/Users/Familjen-Styren/Documents/V\u00E5gformer/20140104-0002/text.txt」とは限りません。代わりに、Java で入力ウィンドウを作成し、Unicode 文字をユニバーサル文字名に「エスケープ」します。そして、Cでは「エスケープされません」(これは、Javaからcにマルチバイト文字を渡す際の問題を回避するために行います)。したがって、実際にユーザーに文字列 (ファイル名) を入力するように求める例を次に示します。

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

int func(const char *fname);

int main()
{
   char src[100];
   scanf("%s", &src);
   printf("%s\n", src);
   int exists = func((const char*) src);
   printf("Does the file exist? %d\n", exists);
   return exists;
}

int func(const char *fname)
{
    FILE *file;
    if (file = fopen(fname, "r"))
    {
        fclose(file);
        return 1;
    }
    return 0;
}

これで、汎用文字名は実際のファイル名の一部にすぎないと見なされます。では、入力に含まれる普遍的な文字名を「エスケープ解除」するにはどうすればよいでしょうか。

最初の編集: この例を次のようにコンパイルします: "gcc -std=c99 read.c" ここで、'read.c' はソース ファイルです。-std=c99 パラメーターが必要なのは、ユニバーサル キャラクター名にプレフィックス '\u' を使用しているためです。「\x」に変更すると問題なく動作し、-std=c99 パラメータを削除できます。しかし、私の実際のアプリケーションでは、入力は接頭辞「\x」を使用せず、代わりに接頭辞「\u」を使用します。では、どうすればこれを回避できますか?

このコードは望ましい結果をもたらしますが、実際のアプリケーションでは「\x」を実際に使用することはできません:

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

int func(const char *fname);

int main()
{
   char *src = "C:/Users/Familjen-Styren/Documents/V\x00E5gformer/20140104-0002/text.txt";
   int exists = func((const char*) src);
   printf("Does the file exist? %d\n", exists);
   return exists;
}

int func(const char *fname)
{
    FILE *file;
    if (file = fopen(fname, "r"))
    {
        fclose(file);
        return 1;
    }
    return 0;
}

オリジナル: javascript などの他のプログラミング言語でこれを行う方法の例をいくつか見つけましたが、C でこれを行う方法の例を見つけることができませんでした。同じエラーを生成するサンプル コードを次に示します。

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

int func(const char *fname);

int main()
{
   char *src = "C:/Users/Familjen-Styren/Documents/V\u00E5gformer/20140104-0002/text.txt";
   int len = strlen(src); /* This returns 68. */
   char fname[len];
   sprintf(fname,"%s", src);
   int exists = func((const char*) src);
   printf("%s\n", fname);
   printf("Does the file exist? %d\n", exists); /* Outputs 'Does the file exist? 0' which means it doesn't exist. */
   return exists;
}

int func(const char *fname)
{
    FILE *file;
    if (file = fopen(fname, "r"))
    {
        fclose(file);
        return 1;
    }
    return 0;
}

代わりに、ユニバーサル文字名なしで同じ文字列を使用すると:

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

int func(const char *fname);

int main()
{
   char *src = "C:/Users/Familjen-Styren/Documents/Vågformer/20140104-0002/text.txt";
   int exists = func((const char*) src);
   printf("Does the file exist? %d\n", exists); /* Outputs 'Does the file exist? 1' which means it does exist. */
   return exists;
}

int func(const char *fname)
{
    FILE *file;
    if (file = fopen(fname, "r"))
    {
        fclose(file);
        return 1;
    }
    return 0;
}

「ファイルは存在しますか?」と出力されます。1'. つまり、実際に存在するということです。しかし問題は、私が普遍的な性格を扱えるようになる必要があるということです。では、普遍的な文字名を含む文字列をエスケープ解除するにはどうすればよいでしょうか?

前もって感謝します。

4

2 に答える 2