遍历char *并将每个char与另一个char比较

时间:2020-05-09 08:53:49

标签: c string character string-comparison strcmp

我不精通c语言,但是遇到问题

  1. 一个字符一个字符地重复
  2. 正确比较单个字符和另一个字符

给定一个字符串,例如“ abcda”,我想计算“ a”的数目并返回计数

    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>

    int main(int argc, char** argv){
        char* string_arg;
        int counter = 0;
        if(argc == 2){
            for(string_arg = argv[1]; *string_arg != '\0'; string_arg++){
                printf(string_arg);
                printf("\n");
                /*given abcda, this prints
                abcda                    a
                bcda                     b
                cda        but i want    c
                da                       d 
                a                        a */

                if(strcmp(string_arg, "a") == 0){ //syntax + logical error
                    counter++;
                }
            }
         printf(counter);
         }
         else{
             printf("error");
         }
         return(0);
    }

我也不应该使用strlen()

如何一次正确比较一个字符?

2 个答案:

答案 0 :(得分:1)

    未声明
  • arg。似乎应该是argc
  • printf(string_arg);很危险,因为string_arg是用户输入,可以包含任意字符串,其中可以包含%
  • strcmp()(如果用于比较字符串)。您可以简单地使用==来比较字符。
  • printf(counter);也错了。
  • }函数末尾的
  • main已丢失。

示例修复程序:

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char** argv){
    char* string_arg;
    int counter = 0;
    if(argc == 2){
        for(string_arg = argv[1]; *string_arg != '\0'; string_arg++){
            puts(string_arg);
            /*given abcda, this prints
            abcda                    a
            bcda                     b
            cda        but i want    c
            da                       d 
            a                        a */

            if(*string_arg == 'a'){
                counter++;
            }
        }
        printf("%d", counter);
    }
    else{
        printf("error");
    }
    return(0);
}

答案 1 :(得分:1)

if (strcmp(string_arg, "a") == 0) { 
     counter++;
}

调用strcmp不适用于您的情况,因为它比较字符串。通过此语句,您将比较从string_arg指向的元素开始的字符串和字符串"a",而不是字符常量'a'。请注意,"a"等于'a' + '\0'

相反,您需要将*string_arg'a'进行比较:

if (*string_array == 'a') { 
     counter++;
}

puts(string_arg);打印一个字符串。那不是你想要的。您只想打印一个字符。使用printf("%c", *string_arg);来打印字符。

请注意,像printf(string_arg);之类的东西很危险。始终使用格式说明符:printf("%c", *string_arg);。在以下链接中解释了原因:

Why is printf with a single argument (without conversion specifiers) deprecated?


这将是您想要的:

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main (int argc, char** argv) {

    char* string_arg;
    int counter = 0;

    if (argc == 2){

        for (string_arg = argv[1]; *string_arg != '\0'; string_arg++) {

            printf("%c", *string_arg);
            printf("\n");

            if (*string_arg == 'a') { 
                counter++;
            }
        }

        printf("%d times character 'a' encountered.", counter);
     }
     else {
        printf("Error: No second argument at the program invocation!");
     }

     return 0;
}
相关问题