我已将代码最小化到重现此错误所需的内容。我有一个我认为是完美的if语句,但gcc坚持认为它不是一个有效的陈述。
#define SOMECHAR *
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char* my_string = (char*) malloc(sizeof(char[5]));
strcpy(my_string, "aa*a");
int i;
for (i=0; i< sizeof(my_string); i++){
if(strcmp(&my_string[i], SOMECHAR) == 0){
printf("%s", "b");
} else {
printf("%s", &my_string[i]);
}
}
}
答案 0 :(得分:0)
首先,size_of(my_string)
是指针的大小,而不是指向的数组的大小。
接下来,strcmp(&my_string[i], SOMECHAR)
将扩展为strcmp(&my_string[i], *)
,您需要:
#define SOMECHAR "*"
但是,我相信你想要这个:
if(my_string[i] == '*'){
putchar('b');
} else {
putchar(my_string[i]);
}
正如M.M在评论中所说,你泄漏了你分配的内存
如果你真的需要定义那个角色,只需这样做:
#define SOMECHAR '*'
/*some other code */
if(my_string[i] == SOMECHAR){
putchar('b');
} else {
putchar(my_string[i]);
}
答案 1 :(得分:0)
感谢您的意见和建议,我想出了我真正想要的东西。 第一个问题是#define一个字符,它需要用单引号。而sizeof()完全用于描述指针的大小,而不是它的长度。我应该使用strlen()。菜鸟错了。我的主要方法在这里没有返回,所以一旦修复我已经遇到的错误就会出现问题。
但是,如果没有循环和条件检查,我可以更好地完成我需要的工作。在string.h中有一个名为strchr的函数,它将在匹配给定字符之前返回指向字符串中最后一个字符的指针。我已经修改了我的代码:
#define SOMECHAR '*'
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char* line = (char*) malloc(sizeof(char[5]));
strcpy(line, "aa*a");
int i;
char* ending;
printf("%s\n", line);
ending = strchr(line, SOMECHAR);
ending[0] = '\0';
printf("%s\n", line);
return 0;
}
这会在匹配前的字符处终止给定的字符串。这是我的任务所需要的。谢谢大家的帮助。