2016-01-24 4 views
-2

Я работаю над проектом инициалов, в котором вы вводите имя, и оно печатает инициалы. Когда я пытаюсь объединить строки, он возвращает Segmentation fault вместо инициалов.C инициалы программы возвращены «Ошибка сегментации»

#include <stdio.h> 
#include <stdlib.h> 
#include <cs50.h> 
#include <string.h> 
#include <ctype.h> 

int main(void) { 
    printf("Name: "); 
    string name = GetString(); 
    printf("\n"); 

    int length = strlen(name); 
    string initials = ""; 
    int arraylength = length + 1; 
    char string[arraylength]; 
    string[0] = toupper(name[0]); 
    int count = 1; 
    for(int l = 1;l<=length;l++) { 
     if(name[l] == ' ') { 
     l++; 
     count++; 
     string[l] = toupper(name[l]); 
    } 
} 
count++; 
string[count] = '\0'; 
for(int c = 0;c<=count;c++) { 
    strcat(initials, &string[c]); 
} 
printf("%s\n", initials); 
} 
+3

В: Что это за «строка» в вашей программе? Можете ли вы скопировать/psate определение для 'string' и прототип для' GetString() 'в ваш пост? И вы не можете использовать 'strcat()' с переменной «char». – paulsm4

+2

@ paulsm4 Поиск * cs50.h * Я не мог в это поверить, когда увидел это вчера. –

ответ

3

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

Строки, как и ожидалось strlen() или strcat() или всех str * функции, это не просто char указателя, который является то, что тип string в вашем коде.

В a фактически представляет собой последовательность байтов с последним байтом '\0', и это необязательно. Вы создаете указатель на один char, и это не то же самое, что строка, которую я только что описал.

Любой из str * функций будет пытаться найти '\0', но так как вы передается адрес переменной стека, которая не является массивом, то поведение не определено, когда любой из этих функций пытаются увеличивать и разыменования пройденный указателем.

Когда вы понимаете, как строки работают в вы бы увидели, что с помощью strcat() для конкатенации многих кусков большой строки вместе не очень эффективно, вы также знаете, что вам просто нужно добавить один char и что вы можете просто использовать индексные обозначения, например

char string[8]; 

string[0] = 'E'; 
string[1] = 'x'; 
string[2] = 'a'; 
string[3] = 'm'; 
string[4] = 'p'; 
string[5] = 'l'; 
string[6] = 'e'; 
string[7] = '\0'; // The very necessary terminator 
+0

Действительно 'cs50.h' сосет из-за этого типа' string'. Гарвард - не лучшее место для изучения программирования на С. – chqrlie

+0

@iharob Я добавил это, но он все еще не работает –

+1

Вы добавили что? ваш код имеет много проблем. Сначала попробуйте узнать о строках [tag: c] и снова напишите код. –

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