C 缩写程序返回 "Segmentation fault"

标签 c strcat cs50

我正在开发一个缩写项目,您可以在其中输入姓名,然后它会打印缩写。当我尝试组合字符串时,它返回段错误而不是缩写。

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

最佳答案

这就是为什么字符串类型会引起困惑,你创建了一个指向单个字符的指针。然后你将它传递给 strcat() 这是完全错误的。

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

一个实际上是一个字节序列,最后一个字节是'\0',并且它不是可选的。您创建了一个指向单个 char 的指针,这与我刚才描述的字符串不同。

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

当您了解 中字符串如何工作时您会发现使用 strcat() 将大字符串的许多 block 连接在一起并不是很有效,您还会知道您只需要附加一个 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

关于C 缩写程序返回 "Segmentation fault",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34982848/

相关文章:

c - 如何在没有 stdio 的情况下为我的操作系统在 c 中创建 printf 函数?

c - 如何从源代码生成 .cpp 文件?

c - 音频输出有问题,没有欠载

c - 在 C 中用 2 个字符包围一个字符串

c++ - 在 C 中使用指针时出现段错误

c - 预期退出代码 0,而不是 1?

c - 程序无法通过测试用例

c程序如何在strcat中创建多个文本文件

c - 字符串声明段错误

c - 对字符串的每个数字进行排序