我需要确定用户输入是否为数字。我需要遍历每个字符,并检查所有字符是否都是数字,如果不是printf()
错误消息,或者是否成功。我使用了for循环遍历每个字符,并使用了if
函数的isdigit()
语句来检查数字。但是我的问题是我要为每个字符打印。例如,如果输入22A
,则会收到2条关于2
和2
的成功消息,然后收到A
的错误消息。但是我只需要打印错误消息,因为22A
并不完全是数字。
int n = strlen(argv[1]);
for (int i=0; i<n; i++){
if (isdigit((int)argv[1][i]) == 0){
printf("Error\n");
return 1;
}
else{
printf("Success\n");
printf("%i\n", atoi(argv[1]));
}
}
答案 0 :(得分:0)
如果可以使用其他方式,则可以使用string.h
中的strspn()
。
size_t n = strlen(argv[1]);
if(strspn(argv[1], "0123456789")==n)
{
printf("Success\n");
}
else
{
printf("Error\n");
}
strspn()
返回第一个参数字符串的初始段中的字节数,该字节数仅由字节f组成
rom第二个参数字符串,在这种情况下是数字。
因此,如果strspn()
返回的值与字符串的长度相同,则该字符串没有非数字字符。
strlen()
不完全返回int
。它是size_t
。最好改用后者。参见strlen to return size_t?。
答案 1 :(得分:-1)
但是我的问题是我要为每个字符打印。
您需要在循环之后将printf("Success\n");printf("%i\n", atoi(argv[1]));
移动
例如:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int main(int argc, char ** argv)
{
if (argc != 2)
printf("Usage: %s <something>\n", *argv);
else {
int n = strlen(argv[1]);
for (int i=0; i<n; i++){
if (isdigit((int)argv[1][i]) == 0){
printf("Error\n");
return 1;
}
}
printf("Success\n");
printf("%i\n", atoi(argv[1]));
}
return 0;
}
编译和执行:
pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Werror nn.c
pi@raspberrypi:/tmp $ ./a.out 123
Success
123
pi@raspberrypi:/tmp $ ./a.out 123a
Error
pi@raspberrypi:/tmp $ ./a.out aze
Error
pi@raspberrypi:/tmp $ ./a.out 1111111111111111111111111111111111
Success
2147483647
pi@raspberrypi:/tmp $
您会看到最后一个结果为false,输入的值不是2147483647
您不需要使用 strlen ,您可以迭代到空字符for (int i=0; argv[1][i]; i++){
,从而赢得对字符串的扫描
您还可以使用指针:
for (const char * p = argv[1]; *p; ++p){
if (isdigit((int)*p) == 0){
无需在循环后调用 atoi ,您可以自己计算数字,从而再次赢得对字符串的扫描:
int r = 0;
for (const char * p = argv[1]; *p; ++p) {
if (isdigit((int)*p) == 0) {
puts("Error");
return 1;
}
else
r = r*10 + *p - '0';
}
printf("Success\n%i\n", r);
我鼓励您不要使用 atoi ,即使您知道(实际上不是在这里)您有一个号码(跳跃而不会溢出),也可以使用 strtol < / em>,其返回值(如果可能)为读取的 long ,并同时指示(仅)字符串中是否存在(仅) long ,更多的是溢出检测
例如:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(int argc, char ** argv)
{
if (argc != 2)
printf("Usage: %s <something>\n", *argv);
else {
errno = 0;
char * endptr;
long v = strtol(argv[1], &endptr, 10);
if ((errno != 0) || (*endptr != 0))
puts("Error");
else
printf("Success %ld\n", v);
}
return 0;
}
编译和执行:
pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Werror n.c
pi@raspberrypi:/tmp $ ./a.out
Usage: ./a.out <something>
pi@raspberrypi:/tmp $ ./a.out 123
Success 123
pi@raspberrypi:/tmp $ ./a.out -12345
Success -12345
pi@raspberrypi:/tmp $ ./a.out -12345a
Error
pi@raspberrypi:/tmp $ ./a.out a
Error
pi@raspberrypi:/tmp $ ./a.out 11111111111111111111111111111111111
Error
在最后一种情况下,会发生溢出
如果您不接受负值(使用 int 但开头不接受'-'),请检查结果的符号,并警告 strtoul 接受负值