我基本上有这个
void process(char * str){
int z = 0;
char * copy = malloc(sizeof(char)*(strlen(str)+1));
printf("Original: %s\n", str);
for(z = 0; z<strlen(str);z++){
char tempone = tolower(str[z]);
copy[z] = tempone;
}
z++; copy[z] = '\0';
printf("Copy: %s\n", copy);
}
但我得到的结果是:
Original: If
Copy: ifu
我想要的时候:
Original: If
Copy: if
这个错误只发生在某些文字上,所以我不确定错误是什么。我只是习惯了C所以我不确定我是否遗漏了一些基本的东西。然而,我写的内容看起来很简单,但即使我最初输入“if”,我仍然会将“ifu”作为副本。 str的字符串长度为2
答案 0 :(得分:1)
您不需要额外的
z++;
句子。这是因为z
在最后一次迭代中递增,之后条件z<strlen(str)
失败,当z == strlen(str)为真时。
你得到的那封额外信件:
原文:如果
复制:如果u
只是内存中的垃圾。因为如果在循环之后递增z
,则该值不再在数组的维度内。
所以,我相信这应该有效:
void process(char * str){
int z = 0;
char * copy = malloc(sizeof(char)*(strlen(str)+1));
printf("Original: %s\n", str);
for(z = 0; z<strlen(str);z++){
char tempone = tolower(str[z]);
copy[z] = tempone;
}
copy[z] = '\0';
printf("Copy: %s\n", copy);
}
假设最简单的例子:
原文:我
复制:我
您将执行malloc(sizeof(char)*(1 + 1))。注意到strlen不包含空字符。
for(z = 0; z < 1; z++)
- &gt;这将执行一次。因为在尝试第二次迭代时,您会将z
从0
增加到1
,因此条件z < 1
将为1 < 1
,这是假的。
您希望在'\0'
内放置copy[1]
,而不是copy[2]
。这就是为什么你真的不需要循环外的z++
。
希望它有所帮助。
答案 1 :(得分:-1)
我找到了解决方案。我在for循环之前使用了strcpy,如下所示。
int z = 0;
char * copy = malloc(sizeof(char)*(strlen(str)+1));
strcpy(copy, str);
for(z = 0; z<strlen(str);z++){
*(copy+z) = tolower(*(copy+z));
}
为什么这有效,而其他代码没有,我不知道。