我对c不太熟悉,有问题
- 逐个字符遍历char*
- 正确比较单个字符与另一个字符
给定一个类似"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 != ' '; 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((
如何正确地一次比较一个字符?
if (strcmp(string_arg, "a") == 0) {
counter++;
}
对strcmp
的调用不适合您的情况,因为它比较字符串。使用此语句,您可以比较从string_arg
指向的元素开始的字符串与字符串"a"
,而不是字符常量'a'
。注意,"a"
等于'a'
+' '
。
相反,您需要将*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 != ' '; 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;
}
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 != ' '; 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);
}