我正在开发一个缩写项目,您可以在其中输入姓名,然后它会打印缩写。当我尝试组合字符串时,它返回段错误
而不是缩写。
#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
类型。
在 c一个c-string实际上是一个字节序列,最后一个字节是'\0'
,并且它不是可选的。您创建了一个指向单个 char
的指针,这与我刚才描述的字符串不同。
任何 str
* 函数都会尝试查找 '\0'
但由于您传递了不是数组的堆栈变量的地址,因此行为当这些函数中的任何一个尝试增加和取消引用传递的指针时,该值是未定义的。
当您了解 c 中字符串如何工作时您会发现使用 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/