저는 C를 배우고 있습니다. 수업 연습을 위해, 길이가 긴 if... else if... else...
블록을 다음 코드를 사용하여보다 효율적인 C 코드로 변환하려고합니다. switch
문. 이 코드는 /
또는 -
에 대한 지원을 유지해야하며, 또한 그것을 다음 .
무엇이든은 선택 /c
, /c.abc
의 가변 길이를 지원해야합니다만약 ... else if ... else ... 스위치를 차단하십시오.
- 두 가지 문제가 있습니다.
char *argv[]
은 유닉스 파일 경로를 허용 할 수 있습니다.
기존 블록은 다음과 같습니다
#include <strings.h>
int main(int argc, char* argv[])
{
int i;
for (i=1; i<argc; i++)
{
if (!strcasecmp(argv[i], "/a") || !strcasecmp(argv[i], "-a"))
/* Do something */
else if (!strcasecmp(argv[i], "/b") || !strcasecmp(argv[i], "-b"))
/* Do something */
else if (!strncasecmp(argv[i], "/c", 2) || !strncasecmp(argv[i], "-c", 2))
/* Do something */
else if (!strcasecmp(argv[i], "/d") || !strcasecmp(argv[i], "-d"))
/* Do something */
else if ((argv[i][0] == '/' || argv[i][0] == '-') && (!argv[i][2] || argv[i][2] == '.'))
{
/* Error message */
return 1;
}
else
{
/* For unix filepaths. */
}
return 0;
}
내 초기 생각은 /
또는 -
문제를 방지하기 위해 argv[i][1]
에 switch
를 사용하는 것이 었습니다. 예 :
if ((argv[i][0] == '/' || argv[i][0] == '-') && (!argv[i][2] || argv[i][2] == '.'))
{
switch(argv[i][1])
{
case 'a':
/* Do something */
break;
case 'b':
/* Do something */
break;
case 'c':
/* Do something and process any characters after the . */
break;
case 'd':
/* Do something */
break;
default:
/* Error message */
return 1;
}
}
else
{
/* Unix filepaths and anything else. */
}
지금까지 switch
은 대부분의 작업을 수행합니다. 아쉽게도 if ((argv[i][0] == '/' || argv[i][0] == '-') && (!argv[i][2] || argv[i][2] == '.'))
문은 /a.
과 같은 잘못된 플래그를 허용합니다. switch
에서 가변 길이의 경우 (예를 들어, /c
또는 /c.abc
)를 제거
은 또 다른 가능성이다, 그러나 나는 또한 유효한 /c
을 적용하지 않고 다른 경우는 두 문자의 문자열 길이가 있는지 확인하는 방법을 모르겠어요.
if... else if... else...
블록을 switch
블록으로 변환하는 더 효과적인 방법이 있습니까?
도움을 주시면 감사하겠습니다.
정확히를 elses 멀리 경우에서 이동하려고하는 이유는 무엇입니까? 스위치가 더 효율적이지만 유스 케이스에 맞지 않습니다. –
'을 허용하지 않는 스위치에 대해서만 첫 번째 경우를 확인하여'(! argv [i] [2] || argv [i] [2] =='. ')))'를 대체하십시오. –
getopt : http://man7.org/linux/man-pages/man3/getopt.3.html – kvanberendonck