我正在尝试编写一个程序,以多种形式结合动词。
所以我编写了一个函数,它可以让我获得被保护的部分并将其共轭。固定规则:除了最后2个字符之外的整个字。
我已经习惯了OO,我似乎无法使其成功,而它似乎是一个基本的程序。
我获得了一些奇怪的东西:这是执行结束时的一个屏幕,它将更加明确
我想我在课程中错过了一些东西(可能在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;
}
答案 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
的返回结果。