2

This is probably a very newbish question, but can I fix this so that any characters (except \r) are added to my new string ucontents? Just now it only add characters up until the \r. I want to add characters after \r too.

void to_unix_line_endings(char* contents, char* ucontents) {
  int i;
  for (i = 0; i < strlen(contents); i++) {
    if(contents[i] != '\r') {
      ucontents[i] = contents[i];
    }
  }
}

char out[5000];
to_unix_line_endings("spaghettiand\rmeatballs", out);
printf("%s\n", out);
// Prints "spaghettiand". I want "spaghettiandmeatballs".

Thanks.

2 Answers2

2

In the comments (under your answer), @BLUEPIXY is pointing out that because j will never be equal to length, ucontents will never be NULL terminated in the if(j == length) block.

So although your code example (in the answer section) appeared to work for you as is, the code will eventually fail. printf() needs a null terminator to identify end of string. When the memory you are writing to does not happen to have a NULL terminator in the right spot, it will fail. (as would any of the string functions).

The following change will null terminate your buffer:

void to_unix_line_endings(char* contents, char* ucontents) {
  int i;
  int j = 0;
  int length = strlen(contents);//BTW, good improvement over original post
  for (i = 0; i < length; i++) {
    if(contents[i] != '\r') {
      ucontents[j] = contents[i];
      /*if (j == length) {  //remove this section altogether
        ucontents[j] = '\0';
        break;
      }*/
      j++;//this increment ensures j is positioned 
          //correctly for NULL termination when loop exits
    }
  }
  ucontents[j]=NULL;//add NULL at end of loop
}
ryyker
  • 22,849
  • 3
  • 43
  • 87
1

Fixed like so. Thanks, BLUEPIXY.

void to_unix_line_endings(char* contents, char* ucontents) {
  int i;
  int j = 0;
  int length = strlen(contents);
  for (i = 0; i < length; i++) {
    if(contents[i] != '\r') {
      ucontents[j] = contents[i];
      if (j == length) {
        ucontents[j] = '\0';
        break;
      }
      j++;
    }
  }
}