Итерации по char * и сравнение каждого символа с другим char - PullRequest
1 голос
/ 09 мая 2020

Я плохо разбираюсь в c, и у меня возникают проблемы с

  1. итерацией по символу * символ за символом
  2. правильное сравнение отдельного символа с другим символ

с заданной строкой типа «abcda», я хочу подсчитать количество «а» и вернуть счет

    #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 ]

1 голос
/ 09 мая 2020
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);. Причина, по которой объясняется по следующей ссылке:

Почему printf с одним аргументом (без спецификаторов преобразования) устарел?


Это должно быть то, что вы хотите :

#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;
}
1 голос
/ 09 мая 2020
  • 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);
}
...