C语言字符串追加、删除与打印程序报错求助:Segmentation fault
嘿,我帮你排查下代码里的问题,搞定这个Segmentation fault就没问题啦!你的核心需求是实现一个追加字符到字符串的程序,但代码里存在好几处类型误用、逻辑错误和内存操作问题,咱们一步步来修复:
1. 变量类型误用的核心错误
你定义了char str1;(单个字符变量),但却用了字符串专属的操作:
scanf("%s", str1):%s是读取字符串的格式符,需要传入字符数组的地址,你传单个char变量会直接触发内存访问错误;strcat(str, str1):strcat的第二个参数要求是char*类型的字符串(必须以'\0'结尾),单个char完全不符合要求,这也是段错误的主要原因之一。
修复:既然你要追加单个字符,就保留char str1;,但要用单个字符的读取和追加方式,不要混用字符串操作。
2. 未初始化的目标字符串
char str[20];定义后没有初始化,里面是随机的垃圾值,而strcat要求目标字符串必须以'\0'结尾,否则会在内存里乱找结束符,导致越界访问。
修复:初始化str为空字符串:char str[20] = "";
3. choice 2(清空字符串)的逻辑错误
你现在的choice 2代码完全偏离需求,scanf("%s", str1)根本不是清空字符串的操作。清空字符串只需要把str的第一个字符设为'\0'即可。
修复:把choice 2的代码改成:
// choice 2 clears the string str[0] = '\0'; printf("String cleared successfully!\n");
4. choice 3(打印字符串)的错误
你现在打印的是str1,但实际要打印的是存储结果的str;而且如果str1是单个char,用printf("%s", str1)也会出错,因为%s需要字符串指针。
修复:把choice 3的代码改成:
// choice 3 prints what's in the string printf("Current string: %s\n", str);
5. 输入单个字符的缓冲区问题
当你用scanf("%i", &choice)读取数字后,输入缓冲区里会留下一个换行符,如果直接用scanf("%c", &str1)读取字符,会先读到这个换行符,导致你输入的字符被跳过。
修复:在读取字符前,用scanf(" %c", &str1)(注意前面的空格,会自动跳过所有空白字符,包括换行)。
完整修复后的代码
整合所有修复,再加上字符串满额判断(避免越界写入)和更清晰的菜单提示,最终代码如下:
#include <stdio.h> #include <string.h> int main(void) { int choice; char str[20] = ""; // 初始化为空字符串 char str1; // 存储要追加的单个字符 while(1) { printf("Give your choice:\n1. Add a letter\n2. Clear string\n3. Print string\nOther. Exit\n"); scanf("%i", &choice); if(choice == 1) { // This choice adds a letter to the string printf("Give a letter: "); scanf(" %c", &str1); // 跳过空白字符,读取单个字符 // 检查字符串是否还有空间(要留一个位置存结束符'\0') if(strlen(str) < sizeof(str) - 1) { // 直接操作数组追加字符:找到末尾位置,赋值后补结束符 size_t len = strlen(str); str[len] = str1; str[len + 1] = '\0'; } else { printf("String is full, can't add more characters!\n"); } } else if(choice == 2) { // choice 2 clears the string str[0] = '\0'; printf("String cleared successfully!\n"); } else if(choice == 3) { // choice 3 prints what's in the string printf("Current string: %s\n", str); } else { // if choice is wrong, it ends the program printf("Faulty input!\n"); break; } } return 0; }
内容的提问来源于stack exchange,提问作者Armeija

