如何正确格式化命令行参数?
How does one correctly format command line arguments?
我正在尝试构建一个简单的程序来熟悉命令行功能,我的格式似乎不正确,但我发现很难准确理解生成的错误消息的含义。我的意图是创建一个程序来检查命令行中的所有字符是否都是数字。这是我的代码:
#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
for (int i = 0; i < strlen(argv); i++)
{
if (!isalnum(argv[i]))
{
printf("Please provide letters or numbers only");
}
else
{
printf("Success!");
}
}
}
我在尝试编译时收到的错误消息是:c:9:32: error: incompatible pointer types passing 'char **' to parameter of type 'const char *'; dereference with * [-Werror,-Wincompatible-pointer-types]
。
argv
是指向字符串的指针的数组(指针)。
isalnum
正在检查一个字符,而不是整个字符串,因此您将需要两个循环:检查每个字符串和检查字符串中的每个字符。
此代码不会收到警告:
#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
for (int c = 1; c < argc; c++) // loop for checking each strings
{
for (int i = 0; i < strlen(argv[c]); i++) // loop for checking each characters in the strings
{
if (!isalnum(argv[c][i]))
{
printf("Please provide letters or numbers only");
}
else
{
printf("Success!");
}
}
}
}
但您可能希望这段代码经过改进:
- 只打印一次消息而不是每个字符。
- 使用
size_t
循环直到字符串的长度。
- 在循环之前调用
strlen()
一次,而不是在每次迭代中调用。
- 使用
puts
而不是 printf
在输出末尾打印换行符。
- 添加
return 0;
澄清代码returns 0.
- 删除不必要的
#include
,包括非标准的。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
int all_ok = 1;
for (int c = 1; c < argc; c++)
{
size_t len = strlen(argv[c]);
for (size_t i = 0; i < len; i++)
{
all_ok = all_ok && isalnum(argv[c][i]);
}
}
if (!all_ok)
{
puts("Please provide letters or numbers only");
}
else
{
puts("Success!");
}
return 0;
}
我正在尝试构建一个简单的程序来熟悉命令行功能,我的格式似乎不正确,但我发现很难准确理解生成的错误消息的含义。我的意图是创建一个程序来检查命令行中的所有字符是否都是数字。这是我的代码:
#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
for (int i = 0; i < strlen(argv); i++)
{
if (!isalnum(argv[i]))
{
printf("Please provide letters or numbers only");
}
else
{
printf("Success!");
}
}
}
我在尝试编译时收到的错误消息是:c:9:32: error: incompatible pointer types passing 'char **' to parameter of type 'const char *'; dereference with * [-Werror,-Wincompatible-pointer-types]
。
argv
是指向字符串的指针的数组(指针)。
isalnum
正在检查一个字符,而不是整个字符串,因此您将需要两个循环:检查每个字符串和检查字符串中的每个字符。
此代码不会收到警告:
#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
for (int c = 1; c < argc; c++) // loop for checking each strings
{
for (int i = 0; i < strlen(argv[c]); i++) // loop for checking each characters in the strings
{
if (!isalnum(argv[c][i]))
{
printf("Please provide letters or numbers only");
}
else
{
printf("Success!");
}
}
}
}
但您可能希望这段代码经过改进:
- 只打印一次消息而不是每个字符。
- 使用
size_t
循环直到字符串的长度。 - 在循环之前调用
strlen()
一次,而不是在每次迭代中调用。 - 使用
puts
而不是printf
在输出末尾打印换行符。 - 添加
return 0;
澄清代码returns 0. - 删除不必要的
#include
,包括非标准的。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
int all_ok = 1;
for (int c = 1; c < argc; c++)
{
size_t len = strlen(argv[c]);
for (size_t i = 0; i < len; i++)
{
all_ok = all_ok && isalnum(argv[c][i]);
}
}
if (!all_ok)
{
puts("Please provide letters or numbers only");
}
else
{
puts("Success!");
}
return 0;
}