计划共轭

时间:2017-07-10 06:31:25

标签: c

我正在尝试编写一个程序,以多种形式结合动词。

所以我编写了一个函数,它可以让我获得被保护的部分并将其共轭。固定规则:除了最后2个字符之外的整个字。

我已经习惯了OO,我似乎无法使其成功,而它似乎是一个基本的程序。

我获得了一些奇怪的东西:这是执行结束时的一个屏幕,它将更加明确

enter image description here

我想我在课程中错过了一些东西(可能在char []部分...),这有很大的影响,但我似乎无法找到它。 我对我的代码的所有观察开放,因为我开始了,我现在更喜欢坚实的基础,以后更好。

这是代码

#include <stdio.h>
#include <stdlib.h>
#include<string.h>

void RacineVerbe(char verbeEntier[], char dest[]);
int myStrLen(char *s);
int main()
{
    char *string;
    char *racine;
    string = (char*)malloc(200*sizeof(char));
    racine = (char*)malloc(200*sizeof(char));
    printf("Quel verbe?\n");
    scanf("%s", string);

    RacineVerbe(string, racine);
    printf("%s", racine);
    printf("%sASSE\n", racine);
    printf("%sASSES\n", racine);
    printf("%sAT\n", racine);
    printf("%sASSIONS\n", racine);
    printf("%sASSIEZ\n", racine);
    printf("%sASSENT\n", racine);
    return 0;
}

void RacineVerbe(char verbeEntier[], char dest[]){
int i;
int l = myStrLen(verbeEntier);
for( i = 0; i < l -2 ; i++){
    dest[i] = verbeEntier[i];
}
dest[i+1] = "\0";
}

int myStrLen(char *s){
    int i = 0;
    while(*s++)i++;
    return i;
}

2 个答案:

答案 0 :(得分:2)

您在撰写dest[i+1] = "\0";时调用了UB,因为dest[i+1]期望char并且您为其分配了"\0",这是一个字符串文字。将其替换为'\0'

请注意string = (char*)malloc(200*sizeof(char)); ---&gt; string = malloc(200);因为C中的malloc不需要投放,并且被认为是错误的(as you can see here)而且sizeof(char)根据定义是1

答案 1 :(得分:2)

问题在于RacineVerbe,因为您已将字符串文字分配给单个字符(不是字符的poitner)。

在这种情况下, string literal 会返回它在内存中的地址,并且您分配给该地址的dest[i+i] LSB 字节,它可能是或者可能不是可见的角色。我可以保证,你的编译器至少给了你警告。

第二个问题是你做任务的地方。您应该dest[i]执行此操作,i最后一次在for循环中递增,然后检查失败,因此i已经指向应该写0的位置

void RacineVerbe(char verbeEntier[], char dest[]){
    int i;
    int l = myStrLen(verbeEntier);
    for( i = 0; i < l -2 ; i++){
        dest[i] = verbeEntier[i];
    }
    dest[i] = 0; //This line was rewritten.
}

如前所述,尝试 NOT 转换malloc的返回结果。