如果语句看起来可以接受,但有错误:')'令牌之前的预期表达式

时间:2016-11-04 02:51:29

标签: c string gcc strcmp

我已将代码最小化到重现此错误所需的内容。我有一个我认为是完美的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]);
        }   
    }
}

2 个答案:

答案 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;
}

这会在匹配前的字符处终止给定的字符串。这是我的任务所需要的。谢谢大家的帮助。