C 首字母程序返回 "Segmentation fault"

C initials program returned "Segmentation fault"

我正在开发一个姓名缩写项目,您可以在其中输入姓名并打印姓名缩写。当我尝试组合字符串时,它 returns 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] = '[=11=]';
for(int c = 0;c<=count;c++) {
    strcat(initials, &string[c]);
}
printf("%s\n", initials);
}

这就是为什么 string 类型会引起混淆,您将指针指向单个字符。然后你将它传递给 strcat() 那是完全错误的。

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

a 中实际上是一个字节序列,最后一个字节是'[=17=]',它不是可选的。您创建了一个指向单个 char 的指针,它与我刚才描述的字符串不同。

任何 str* 函数都会尝试找到 '[=17=]' 但由于您传递的不是数组的堆栈变量的地址,因此当这些函数中的任何一个时行为未定义尝试递增和取消引用传递的指针。

当您了解字符串在 中的工作原理时,您会发现使用 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] = '[=10=]'; // The very necessary terminator