在C中添加随机字符

时间:2014-02-28 22:22:12

标签: c

我基本上有这个

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

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);

 }

假设最简单的例子:

原文:我

复制:我

  1. 您将执行malloc(sizeof(char)*(1 + 1))。注意到strlen不包含空字符。

  2. for(z = 0; z < 1; z++) - &gt;这将执行一次。因为在尝试第二次迭代时,您会将z0增加到1,因此条件z < 1将为1 < 1,这是假的。

  3. 您希望在'\0'内放置copy[1],而不是copy[2]。这就是为什么你真的不需要循环外的z++

  4. 希望它有所帮助。

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

为什么这有效,而其他代码没有,我不知道。