C语言使用strncpy实现字符串数组重排的故障修复问询
字符串左移功能的代码故障点与修复方案
代码存在的具体故障
- 存储结构定义错误:当前
char arr[100]是一维字符数组,最多只能存1个长度99的字符串,根本无法存放["zero", "one", "two"]这类多字符串序列,需替换为可存储多字符串的二维字符数组或字符指针数组 - 循环条件写反:两个for循环的判断条件均为
j > 边界值,因循环初始值j=0小于所有正的边界值,循环体一次都不会执行,完全触发不了移位、打印逻辑,需将判断逻辑改为j < 边界值 strncpy参数完全错配:strncpy要求前两个参数为目标地址、源地址(均为char*类型),当前传入的a[j]是单个字符值,类型完全不匹配- 拷贝长度传参错误:数组传入函数后会退化为指针,
sizeof(a)拿到的是指针本身的长度,不是字符串存储长度,需替换为单个字符串的最大可拷贝长度
- 字符串赋值方式错误:C语言不支持直接用
=为数组赋值字符串,arr[i] = input本质是把input数组的首地址当成单个字符值写入对应位置,完全达不到存储字符串的效果,需通过字符串拷贝函数完成赋值 - 移位逻辑缺失关键步骤:仅写了元素前移的逻辑,没有提前保存原数组第一个元素的值,就算循环正常运行,也会在前移过程中把原首元素覆盖,无法实现“原首元素补到数组末尾”的左移闭环,达不到["one","two","zero"]的预期效果
- 函数定义错误:函数声明返回值为
char但无对应返回语句,且整个移位操作不需要返回值,应修改为void类型 - 交互提示歧义:main函数外层已经引导用户输入字符串总个数,循环内的输入提示仍重复写“Input the number of strings”,会误导用户,应改为提示用户输入具体字符串内容
修复后的完整可运行代码
#include <stdio.h> #include <string.h> // 单个字符串预留32长度,足够存储zero/one/two这类短文本 #define MAX_STR_LEN 32 // 最多支持存储100个字符串元素 #define MAX_STR_CNT 100 void stringreplace(char a[][MAX_STR_LEN], int b) { // 提前保存原数组第一个元素的值,左移完成后补到末尾 char temp[MAX_STR_LEN]; strncpy(temp, a[0], MAX_STR_LEN - 1); temp[MAX_STR_LEN - 1] = '\0'; // 所有元素整体左移一位:将后一位的内容拷贝到前一位 for(int j = 0; j < b - 1; j++){ strncpy(a[j], a[j+1], MAX_STR_LEN - 1); // 手动补字符串结束符,避免乱码 a[j][MAX_STR_LEN - 1] = '\0'; } // 将提前保存的原首元素放到数组最后一个位置 strncpy(a[b-1], temp, MAX_STR_LEN - 1); a[b-1][MAX_STR_LEN - 1] = '\0'; // 打印移位后的结果 for(int j = 0; j < b; j++){ printf("%s ", a[j]); } printf("\n"); } int main() { char input[MAX_STR_LEN]; // 二维字符数组,每一行存储一个独立字符串 char arr[MAX_STR_CNT][MAX_STR_LEN] = {0}; int number; printf("Input the number of strings: "); scanf("%d", &number); for(int i= 0; i < number; i++){ printf("Input string %d: ", i+1); scanf("%s", input); // 通过strncpy完成字符串赋值,不能直接用= strncpy(arr[i], input, MAX_STR_LEN - 1); arr[i][MAX_STR_LEN - 1] = '\0'; } stringreplace(arr, number); return 0; }
运行效果
输入3个字符串zero、one、two时,程序会按预期输出one two zero,完全匹配左移需求。
内容的提问来源于stack exchange,提问作者ege Selcuk
相关产品推荐
相关产品推荐

