2015-10-19 2 views
0

Я пытаюсь создать массив шаблонов для треугольника, который я также печатаю на консоли. Я делаю это, создавая массив 2d char, где шаблоны символов [number_of_patterns] [pattern_lengths]. Я передаю это функции, которая принимает шаблоны массива вместе с высотой треугольника, который я пытаюсь сделать.Заполнение строки с помощью sprintf, C

void printTriangle (int rows, char rowPatterns[][rows]) { 

    int initialSpaces = rows - 1; 
    int numberOfAsterisks = 1; 
    int i; 

    for (i = 0; i < rows; i++) { 
     char temp[rows]; 
     int spaceCounter = 0; 
     int asteriskCounter = 0; 

     while (spaceCounter < initialSpaces) { 
      printf(" "); 
      sprintf(temp, " "); 
      spaceCounter++; 
     } 
     while (asteriskCounter < numberOfAsterisks) { 
      sprintf(temp, "*"); 
      printf("*"); 
      asteriskCounter++; 
     } 
     while (spaceCounter < initialSpaces) { 
      spaceCounter = 0; 
      sprintf(temp, " "); 
      spaceCounter++; 
     } 


     strcpy(rowPatterns[i], temp); 
     printf("\n"); 
     initialSpaces--; 
     numberOfAsterisks+=2; 
    } 

} 

Для каждой строки треугольника, который я печатаю, я создаю строку для этой строки под названием temp. В конце цикла for, который печатает строку в консоли, и sprintf это к temp массива, я strcpy temp в шаблоны [i]. Затем я возвращаюсь к вершине цикла, повторно инициализирую temp, чтобы сделать его новым, и зацикливаюсь до тех пор, пока у меня не будет всех моих строк. За исключением того, что спринт не заполнит мой массив temp. Является ли это неправильным использование функции, или она должна выполнять w мой параметр передачи?

+0

Здесь нет необходимости использовать 'sprintf' - все, что вы добавляете, - это постоянные строки без форматов, поэтому вы можете просто использовать' strcpy'. И все они являются одиночными символами, поэтому вы можете просто назначить эти одиночные символы. – hobbs

+0

@hobbs: вы могли бы, но я лично лично считаю API 'sprintf' более приятным для построения строк, так как вы просто используете идиом' ptr + = sprintf (ptr, ...) '. – nneonneo

ответ

1

sprintf всегда записывает в начало строки. Для добавления, вы можете сохранить указатель на конец строки:

char *ptr = rowpatterns[i]; 

ptr += sprintf(ptr, "*"); 

Вы могли бы также услышать предложение использовать strcat - избежать этой функции. При построении строк повторение strcat происходит очень медленно и является общим источником проблем с производительностью в строковом коде.

+0

, поэтому я последовал твоему совету и получил тот же результат, что странно, потому что это имеет очень хороший смысл для меня. Может ли это иметь отношение к тому, как я назначаю указатель? –

+0

Пример: while (spaceCounter

+0

Единственная осторожность, требуемая при этом, заключается в том, что 'sprintf()' возвращает -1, чтобы указать сбой. Сложение (вычитание) может привести к нечетным эффектам. Кроме того, вероятно, лучше использовать 'snprintf()', но вы также должны отрегулировать длину буфера. Это означает, что вы в конечном итоге захватили возвращаемое значение, чтобы вы могли добавить его в указатель и вычесть из длины буфера. Но, несомненно, что усложняет код. К сожалению, это означает, что люди часто этого не делают, и, таким образом, создается переполнение буфера. –

Смежные вопросы