конкатенация / печать строкового литерала - PullRequest
2 голосов
/ 14 апреля 2009

У меня странная проблема с конкатенацией или печатью строк. У меня есть символ *, который может быть установлен на одно из нескольких значений строкового литерала.

char *myStrLiteral = NULL;
...
if(blah)
  myStrLiteral = "foo";
else if(blahblah)
  myStrLiteral = "bar";

И у меня есть некоторые другие строки, которые я получаю из библиотечных функций или которые являются конкатенациями ввода - они либо malloc'ed, либо переменные стека. Когда я пытаюсь напечатать (или объединить, используя strcpy () и strcat (), результат тот же), даже если я печатаю строковый литерал последним, он печатает над начальные символы всей строки I Строю или печатаю.

/* otherString1 contains "hello", otherString2 contains "world" */
printf("%s %s %s\n", otherString1, otherString2, myStrLiteral);

/* prints "barlo world" */

Не понимаю ли я что-то о строковых литералах в C?

Ответы [ 2 ]

4 голосов
/ 14 апреля 2009

Убедитесь, что получаемые литералы содержат только те байты, которые вы ожидаете:

void PrintBytes(const char *s)
{
    while (*s) {printf("%d ", *s); s++;}
}

PrintBytes(otherString1);
PrintBytes(otherString2);
PrintBytes(myStrLiteral);

Я подозреваю, что один из них содержит встроенный управляющий символ.

Если вам не важно узнать , какой управляющий символ задействован, вы можете просто напечатать длину каждой строки. Если он длиннее, чем должен быть, где-то есть управляющий символ:

printf("%d\n%s\n", strlen(otherString1), otherString1);
2 голосов
/ 14 апреля 2009

Единственное, о чем я могу думать, это то, что otherString2 содержит возврат каретки, но не перевод строки.

чтобы узнать

  1. Вы можете strlen otherString2 и посмотреть, соответствует ли оно тому, что вы видите
  2. Вы можете посмотреть на otherString2 с помощью отладчика и посмотреть, находится ли 0x0D перед 0x00, заканчивающим строку.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...