2016-03-14 5 views
-6
  1. Моя программа должна печатать все ABC, но я вижу, что у меня проблемы с кодом. Как я могу это исправить? (без указателя на это время).Печать ABC - строка

  2. Какая ошибка времени выполнения в коде и как его исправить?

Вот код:

// Elvis’s hip and happening ABC-printing code 

#include <stdio.h> 
#include <string.h> 

#define NUM_ABC_LET 26 
void makeABC(char abc[NUM_ABC_LET]); 

int main() { 
    char abcString[NUM_ABC_LET] = ""; 
    makeABC(abcString); 
    puts(abcString); 
    return (0); 
} 

void makeABC(char abc[NUM_ABC_LET]) { 
    char letter; 
    for (letter = 'a'; letter <= 'z'; letter++) { 
     strcat(abc, letter); 
    } 
} 
+1

'char abcString [NUM_ABC_LET]' не будет достаточно большим, чтобы разрешить терминатор 'nul'. Вы * пытаетесь * конкатенировать 26 "букв", поэтому размер целевой строки должен быть как минимум 27. –

+0

Что значит «что такое ошибка времени выполнения»? Почему ты не знаешь, что это? – usr2564301

+1

«нет указателя на это время» - неправильное предположение. Вы вряд ли можете что-либо сделать в C с массивом без использования указателя. И вы должны сказать, какую ошибку вы получите и где! Узнать [ask]. – Olaf

ответ

0

Вы можете попробовать что-то вроде следующего? Я не тестировал следующее, но он должен работать большей частью.

// Elvis’s hip and happening ABC-printing code 

#include <stdio.h> 
#include <string.h> 

#define NUM_ABC_LET 26 
void makeABC(char abc[NUM_ABC_LET]); 

int main() 
{ 
    char abcString[NUM_ABC_LET + 1]; 
    makeABC(abcString); 
    puts(abcString); 
    return 0; 
} 

void makeABC(char abc[NUM_ABC_LET + 1]) 
{ 
    char letter; 
    int i=0; 
    for(letter = 'a'; letter <= 'z'; letter++) 
    { 
    abc[i] = letter; 
    i++; 
    } 
    abc[i]='\0'; 
} 
1

Проблема заключается в том, что функция strcat ожидает оба аргументов, чтобы быть (нуль) строкой. Вы передаете только одну строку, а затем один один символ в качестве аргументов (который должен дать вам предупреждения компилятора).

Вам нужно преобразовать эти одиночные символы в строку (или массив ) одного символа.

И не забывайте, что строки в C имеют нулевое завершение.


Что происходит использовать один символ в качестве аргумента функции strcat является то, что компилятор преобразует его в int, который затем, в свою очередь преобразуется в указатель. Проблема заключается в том, что адрес 'a' (например) не является допустимым адресом для строки. Это приведет к неопределенного поведения и аварии.

1

Ваша программная логика правильная, проблема заключается в вызове функции strcat(). strcat() функция реализована как:

char *strcat(char *dest, const char *src) 
{ 
char *ret = dest; 
while (*dest) 
    dest++; 
while (*dest++ = *src++); 
return ret; 
} 

второй аргумент должен быть строкой, вместо которой вы передаете характер. Это причина вашей ошибки времени выполнения.

0

Ваша программа имеет несколько вопросов:

  • Вы не можете назвать strcat с char, вы должны пройти char * аргументы, указывающие на оканчивающихся нулем строки C.
  • Массив, в который вы сочиняете алфавит, слишком короткий: вам нужно определить его с размером, большим, чем количество символов для окончательного терминатора '\0'.

Вот исправленный вариант:

#include <stdio.h> 
#include <string.h> 

#define NUM_ABC_LET ('z' - 'a' + 1) // 26 ASCII letters 

void makeABC(char *abc); // makeABC receives a pointer to an array of char 
          // this declaration is equivalent to 
          // void makeABC(char abc[NUM_ABC_LET+1]); 
          // but less error prone 

int main(void) { 
    char abcString[NUM_ABC_LET + 1] = ""; 
    makeABC(abcString); 
    puts(abcString); 
    return 0; 
} 

void makeABC(char *abc) { 
    char letter; 
    char buf[2]; // a buffer for a 1 letter C string 

    for (letter = 'a'; letter <= 'z'; letter++) { 
     buf[0] = letter; // make a 1 letter string 
     buf[1] = '\0'; // set the null terminator 
     strcat(abc, buf); 
    } 
} 
0

Прототип strcat является символ * strcat (символ * назначения, Const символ * источник);

означает наш источник, а также направления и должны быть строкой, так что это вопрос, почему при компиляции в Turbo C это будет через ошибку

«тип несоответствия».

и если вы хотите программу записи для печати ABC до Z, чем просто написать

недействительным основной() {

int i; 
    for(i = 65; i<=90; i++) 
    { 
     printf("%c", i); 
    } 

}

Я надеюсь, вам понравится ... ...

0

Как небольшое изменение, я бы предложил передать длину символьного массива функции, чтобы функция не переполняла массив.

Поскольку массив символов передается функции как указатель, функция не знает его размера.

В вашем случае вы знаете размер, но для будущего может быть лучше явно передать размер.

Также я просто скопировал символы, а не использовал strcat, и добавил завершение нулевой точки в конце.

#include <stdio.h> 
#define NUM_ABC_LET 26 

/* function takes pointer to array and size of array */ 
void makeABC(char *abc, int len); 

int main() 
{ 
    /* array needs to include space for null termination */ 
    char abcString[NUM_ABC_LET + 1]; 
    /* call function with pointer + size */ 
    makeABC(abcString, NUM_ABC_LET); 
    printf("%s\n", abcString); 
    return (0); 
} 

void makeABC(char *abc, int len) 
{ 
    int n; 
    for(n = 0; n < len; n++) { 
     /* add letters to the array */ 
     abc[n] = n + 'a'; 
    } 
    /* put a null termination on the end */ 
    abc[n] = '\0'; 
} 
Смежные вопросы