2016-07-26 4 views
-1

Не соответствует ли мой синтаксис? Я сделал ошибку где-то?Использование sharps (#) Я пытаюсь напечатать пирамиду, как в конце игры Mario

Это сообщения об ошибках, которые я получил. Я попытался исправить все эти ошибки, но я ударил стену и не знаю, что делать.

~/workspace/pset1 $ make mario 
clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wshadow mario.c -lcs50 -lm -o mario 
mario.c:27:15: error: incompatible pointer to integer conversion assigning to 'char' from 'char [2]' [-Werror,-Wint-conversion] 
     blank = "s"; 
      ^~~~ 

mario.c:29:14: error: incompatible pointer to integer conversion assigning to 'char' from 'char [2]' [-Werror,-Wint-conversion] 
     hash = "#"; 
      ^~~~ 

mario.c:30:16: error: incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *' [-Werror,-Wint-conversion] 
     printf(blank*(h-(i + 1))); 
       ^~~~~~~~~~~~~~~~~ 

/usr/include/stdio.h:362:43: note: passing argument to parameter '__format' here 
extern int printf (const char *__restrict __format, ...); 
             ^

mario.c:30:16: error: format string is not a string literal (potentially insecure) [-Werror,-Wformat-security] 
     printf(blank*(h-(i + 1))); 
       ^~~~~~~~~~~~~~~~~ 

mario.c:31:40: error: adding 'int' to a string does not append to the string [-Werror,-Wstring-plus-int] 
     printf(hash*((h+1)-(h-(i + 1)))+"\n"); 
       ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~ 

mario.c:31:40: note: use array indexing to silence this warning 
mario.c:31:16: error: format string is not a string literal (potentially insecure) [-Werror,-Wformat-security] 
     printf(hash*((h+1)-(h-(i + 1)))+"\n"); 
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

6 errors generated. 
make: *** [mario] Error 1 

Источник

#include <stdio.h> 
#include <cs50.h> 

int main() 
{ 
    int h; 
    // asking the user to pick the height of the half pyramid 
    do 
    { 
     printf("Pick a number from 1-23: \n"); 
     h = GetInt(); 
    } 
    while (h > 23); 

    // if the number is 5 the half pyramid should look like this 
    // ----## 
    // ---### 
    // --#### 
    // -##### 
    // ###### 
    // like at the end of super mario 

    int i; 
    for (i = 0; i < h; i++) 
    { 
     char blank; 
     blank = "s"; 
     char hash; 
     hash = "#"; 
     printf(blank * (h-(i + 1))); 
     printf(hash * ((h+1)-(h-(i + 1)))+"\n"); 
    } 
    // I wanted to test my code with s and # 
    // because I don't know how to print blank spaces in C 
} 
+1

'пустой = '«; 'и' хэш = '#', 'Двойные кавычки для строк, одинарные кавычки для символов. Что касается 'printf', это не работает. Прочтите страницу руководства или одну из [этих прекрасных книг] (http://stackoverflow.com/a/562377/3386109). – user3386109

+2

И '((h + 1) - (h- (i + 1)))' можно упростить до: '(i + 2)', насколько я вижу. –

+0

Вы не можете построить строку из нескольких символов, используя '*', как, например, в Python (или Ruby?). Вам придется печатать их по очереди в цикле. –

ответ

3

Использование printf с шириной* и прецизионных.* флагов:

char *blank = "";//use char* (or const char*) for string literal 
char *hash = "########################";//#*(23+1) 
for (int i = 0; i < h; i++) 
{ 
    printf("%*s", h-(i + 1), blank); 
    printf("%.*s\n", i + 2, hash); 
} 

Основные операции s постоянного кратного строки не существует в C.
(например, "#" * 5 => "#####")
Итак, чтобы реализовать самостоятельно.
Например, что-то вроде следующего.

#include <stdlib.h> 
#include <string.h> 
//... 
char *stringXn(const char *string, size_t n){ 
    size_t len = strlen(string); 
    char *ret = malloc(len * n + 1);//allocate myself, +1 : for terminator('\0') 
    if(ret == NULL){ 
     fprintf(stderr, "malloc failed in %s function\n", __func__); 
     exit(EXIT_FAILURE); 
    } 
    *ret = 0; 
    for(size_t i = 0; i < n; ++i){ 
     memcpy(ret + i * len, string, len+1);//+1 : for terminator('\0') 
    } 
    return ret; 
} 

С его помощью вы можете написать в следующем

for (int i = 0; i < h; i++) 
{ 
    char *blank = stringXn(" ", h-(i + 1)); 
    char *hash = stringXn("#", i + 2); 
    printf(blank); 
    puts(hash);//printf("%s\n", hash); 
    free(blank);//deallocate myself 
    free(hash); 
} 
+1

@AlterMann спасибо за редактирование. – BLUEPIXY

+0

мальчик, я ценю ваш ответ. Мой код работает, и я могу двигаться дальше. Однако это мой первый день, пишущий что-либо на C, и как новичок я не понимаю термины width, precision, flags, const или строковый литерал. Мой ограниченный фон находится в Python, который кажется гораздо более интуитивным, чем C. Есть ли способ написать это так, как понял бы новичок? - Спасибо, Ara –

+0

учиться один за другим. – BLUEPIXY

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

  • Нет связанных вопросов^_^