編集3:コード自体については、最初の回答またはこの投稿の最後を確認してください。
タイトルで述べたように、私はオプションの引数が関数に渡されたかどうかを判断する方法を見つけようとしています。私がやろうとしているのは、ほとんどすべての動的言語が部分文字列関数を処理する方法のようなものです。以下は現在私のものですが、使用されているかどうか/いつ使用されているかを判断する方法がわからないため、機能しません。
char *substring(char *string,unsigned int start, ...){
va_list args;
int unsigned i=0;
long end=-1;
long long length=strlen(string);
va_start(args,start);
end=va_arg(args,int);
va_end(args);
if(end==-1){
end=length;
}
char *to_string=malloc(end);
strncpy(to_string,string+start,end);
return to_string;
}
基本的には、戻したい文字列の長さを含めずに、文字列の最後まで移動できるようにしたいのです。しかし、私はこれを行う方法を見つけることができないようです。Cで渡された引数の数を知る方法もないので、それは私の最初の考えを奪いました。
編集:これを行うための新しい方法は、現在のコードです。
#define substring(...) P99_CALL_DEFARG(substring, 3, __VA_ARGS__)
#define substring_defarg_2 (0)
char *substring(char *string,unsigned int start, int end){
int unsigned i=0;
int num=0;
long long length=strlen(string);
if(end==0){
end=length;
}
char *to_string=malloc(length);
strncpy(to_string,string+start,end);
return to_string;
}
次に、ファイルでtest.cを呼び出して、機能するかどうかを確認します。
#include "functions.c"
int main(void){
printf("str:%s",substring("hello world",3,2));
printf("\nstr2:%s\n",substring("hello world",3));
return 0;
}
features.cには、これまでに必要なすべてのものを含むfunctions.hのインクルードがあります。これがclangの出力です(clangは通常もう少し詳細を提供するように見えるためです。
In file included from ./p99/p99.h:1307:
./p99/p99_generic.h:68:16: warning: '__error__' attribute ignored
__attribute__((__error__("Invalid choice in type generic expression")))
^
test.c:4:26: error: called object type 'int' is not a function or function
pointer
printf("\nstr2:%s\n",substring("hello world",3));
^~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from test.c:1:
In file included from ./functions.c:34:
In file included from ./functions.h:50:
./string.c:77:24: note: instantiated from:
#define substring(...) P99_CALL_DEFARG(substring, 3, __VA_ARGS__)
GCCは、オブジェクトは関数ではないと言っているだけです
編集2:-1に設定しても変更されないことに注意してください。それでも、同じものがスローされます。私が使用しているコンパイルオプションは次のとおりです。
gcc -std = c99 -c test.c -o test -lm -Wall
Clangは同じものです(それが機能するかどうかは別の質問です。
ここに答える
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include "p99/p99.h"
#define substring(...) P99_CALL_DEFARG(substring, 3, __VA_ARGS__)
#define substring_defarg_2() (-1)
char *substring(char *string, size_t start, size_t len) {
size_t length = strlen(string);
if(len == SIZE_MAX){
len = length - start;
}
char *to_string = malloc(len + 1);
memcpy(to_string, string+start, len);
to_string[len] = '\0';
return to_string;
}
そこからp99が必要になります。選ばれた答えによるものです。ソースディレクトリにドロップするだけで、大丈夫です。また、ライセンスに関する彼の答えを要約します。好きなように使うことはできますが、基本的にはフォークすることはできません。したがって、この目的のために、プロプライエタリまたはオープンソースを問わず、あらゆるプロジェクトでそれと文字列関数を自由に使用できます。
私が尋ねる唯一のことは、少なくともこのスレッドへのリンクを返して、そのスレッドで発生した他の人がスタックオーバーフローについて知ることができるようにすることです。