使用for循环和if语句打印语句

时间:2019-05-23 14:35:11

标签: c string for-loop

我需要确定用户输入是否为数字。我需要遍历每个字符,并检查所有字符是否都是数字,如果不是printf()错误消息,或者是否成功。我使用了for循环遍历每个字符,并使用了if函数的isdigit()语句来检查数字。但是我的问题是我要为每个字符打印。例如,如果输入22A,则会收到2条关于22的成功消息,然后收到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]));   
        }
    }

2 个答案:

答案 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 接受负值