我不精通c语言,但是遇到问题
给定一个字符串,例如“ 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()
如何一次正确比较一个字符?
答案 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;
}