【问题标题】:Iterating through char* and comparing each char to another char遍历 char* 并将每个 char 与另一个 char 进行比较
【发布时间】:2020-08-24 21:26:45
【问题描述】:

我不精通 c,我遇到了问题

  1. 逐个字符迭代 char*
  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()

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

【问题讨论】:

  • 旁注:printf(string_arg); 很危险。 string_arg 是用户输入,所以它可以是任意字符串,包括包含% 的字符串。应该是printf("%s", string_arg);fputs(string_arg, stdout);
  • @MikeCAT 哦,我明白了。当我打印用户输入时,我一定会实现这一点。在这种情况下,他们在那里只是为了让我可以看到。谢谢。
  • @RobertSsupportsMonicaCellio 我在写的时候似乎遗漏了 c。已编辑。

标签: c string character string-comparison strcmp


【解决方案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;
}

【讨论】:

  • 谢谢你,成功了。我的投票没有显示,因为我的声望
  • @Andrew 是的,我最近注意到你的意图是什么。我已经更正了我的代码。
【解决方案2】:
  • 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);
}

【讨论】:

  • arg 只是写这个问题的一个错字。已由 OP 修复。
  • 这确实解决了语法错误,但没有解决循环的逻辑错误。比较应该在“a”和“a”之间,而不是“abcda”和“a”之间。即使在循环的最后一次迭代中也没有发生这种情况@RobertSsupportsMonicaCellio
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2021-12-28
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 2013-12-21
相关资源
最近更新 更多