C首字母缩写程序返回“分段错误”

时间:2016-01-24 23:21:29

标签: c strcat cs50

我正在制作一个首字母项目,您可以在其中输入名称并打印首字母。当我尝试组合字符串时,它返回Segmentation fault而不是首字母。

#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);
}

1 个答案:

答案 0 :(得分:3)

这就是 string 类型会导致混淆的原因,您可以指向一个char。然后你将它传递给strcat(),这完全是错误的。

strlen()strcat()或所有str *函数所期望的字符串不是简单的char指针,类型为string你的代码是。

中,实际上是一个字节序列,最后一个字节为'\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