我被困住了。尝试了好几天。我需要验证输入到argv[1]
的每个char是一个数字,但是我尝试了isdigit
,isalpha
,char
,atoi
转换,但没有成功。我还是编码新手。我感到沮丧并删除了所有内容以重新开始,但这就是我现在的位置。
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int main(int argc, string argv[])
{
if (argc == 2)
{
for (int k = 0; k <strlen(argv[1]); k++)
{
printf("Success!\n");
printf("%s\n", argv[1]);
}
}
else
{
printf("Usage: ./caesar key\n");
}
}
这是我以前去过的地方。每次尝试运行此命令时,我都会不断收到消毒错误:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
include <ctype.h>
#include <stdlib.h>
int main(int argc, string argv[])
{
if (isdigit(argv[1]))
{
if(atoi(argv[1]))
{
if (argc == 2)
{
for (int x = 0; x < strlen(argv[1]); x++)
{
printf("Success!\n");
printf("%s", argv[1]);
}
}
}
}
else
{
printf("Usage: /caesar key\n");
}
}
任何帮助将不胜感激!
答案 0 :(得分:1)
一个简单而肮脏的示例on onlinegdb:
没有做很多测试...
#include <stdio.h>
#include <string.h>
int main(int argc, char * argv[])
{
if (argc == 2)
{
int n = strlen(argv[1]);
for (int k = 0; k < n; k++)
{
if ( isdigit(argv[1][k]) )
{
printf("%c is a digit\n", argv[1][k]);
}
else
{
printf("%c is not a digit\n", argv[1][k]);
}
}
}
else
{
printf("Error\n");
}
}
请记住,argv[1]
是一个字符串,即。字符数组(末尾为chracter)。
所以您必须遍历此数组的所有字符。
编辑:在另一个答案中来自chmike的好评。
答案 1 :(得分:0)
您从for (int x = 0; x < strlen(argv[1]); x++)
开始有了一个不错的开端,很遗憾,它不适用于C。
在C中,字符串以特殊字符'\ 0'终止。函数strlen
对从字符串开头到此特殊字符的字符进行计数。因此,当您写for (int x = 0; x < strlen(argv[1]); x++)
时,将在strlen()
的每个测试中执行x
。
这里是避免这种情况的一种方法:
for (int x = 0, n = strlen(argv[1]); x < n; x++)
这声明i
初始化为0,n
初始化为argv [1]。测试将x
与n
进行比较,比较快。
测试是否到达字符串结尾的另一种方法是测试是否到达特殊字符'\ 0'。
for (int x = 0; argv[1][x] != '\0'; x++)
它们都是等效的。选择。
现在,对于您要测试的每个字符是否为数字。您可以使用功能isdigit()
来为您完成工作。或者,您可以自己编写测试,这并不难。
for (int x = 0, n = strlen(argv[1]); x < n; x++)
if (!isdigit(argv[1][x])) {
printf("failure: argv[1] is not all digits\n");
return;
}
printf("success: argv[1] is all digits\n")
我们自己实施的替代测试是
for (int x = 0, n = strlen(argv[1]); x < n; x++)
if (argv[1][x] < '0' || argv[1][x] > '9') {
printf("failure: argv[1] is not all digits\n");
return;
}
printf("success: argv[1] is all digits\n")
请注意,argv[1][x]
包含字符的ASCII码,而'0'是0的ASCII码。还要注意,数字的ASCII码的范围是'0'至'9',并且范围仅包含数字。这就是为什么argv[1][x]
不是数字的情况下进行以上测试的原因。
答案 2 :(得分:0)
您可以使用一些辅助函数来检查字符串是否包含所有数字。
/* Return pointer to first non-digit character in a string. */
const char *findnondigit(const char *input)
{
while (*input >= '0' && *input <= '9')
{
input++;
}
return input;
}
/* Return 1 if string is all digits, or 0 if it contains a non-digit. */
int checkalldigits(const char *input)
{
/* Find first non-digit character in input. */
input = findnondigit(input);
/* Return whether first non-digit character is the string's null terminator. */
return *input == '\0';
}
例如:
int main(int argc, char *argv[])
{
if (argc > 1)
{
if (checkalldigits(argv[1]))
{
printf("%s is all digits\n", argv[1]);
}
}
}