鱼C论坛

 找回密码
 立即注册
查看: 2661|回复: 5

[已解决]函数指针字符串交换只交换了头字母是为什么

[复制链接]
发表于 2022-11-9 23:49:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 壳970527 于 2022-11-10 00:08 编辑

#include <stdio.h>
#include <string.h>

void printStrs(char **q, int n);
void swapStrs(char **q, int i, int j);

int  main(void)
{
char *p[100];
char osaka[] = "Osaka", kyoto[] = "Kyoto", shiga[] = "Shiga",
  nara[] = "Nara", hyogo[] = "Hyogo", wakayama[] = "Wakayama";
int i, j;
p[0] = osaka; p[1] = kyoto; p[2] = shiga; p[3] = nara; p[4] = hyogo; p[5] = wakayama;
printStrs(p, 6);
while (1) {
  printf("Input a pair of integers: ");
  scanf("%d %d", &i, &j);
  if(i < 0 || i > 5 || j < 0 || j > 5) break;
  swapStrs(p, i, j);
  printStrs(p, 6);
}
return 0;
}
void printStrs(char **q, int n)
{
int i;
printf("------ begin: print_string ------\n");
printf("0: %p %s\n", q[0],q[0]);
printf("1: %p %s\n", q[1],q[1]);
printf("2: %p %s\n", q[2],q[2]);
printf("3: %p %s\n", q[3],q[3]);
printf("4: %p %s\n", q[4],q[4]);
printf("5: %p %s\n", q[5],q[5]);
printf("------ end: print_string ------\n");
}
void swapStrs(char **q, int i, int j)
{
char temp;
temp = *q[i];
*q[i] = *q[j];
*q[j] = temp;
}


上面是写的代码,我交换之后发现只有头字母交换可是后面的字母全都没有交换这是为什么呀,哪里出现了问题,希望大佬能够回答下,谢谢!!
最佳答案
2022-11-10 00:24:29
  1. #include <stdio.h>
  2. #include <string.h>

  3. void printStrs(char **q, int n);
  4. void swapStrs(char **q, int i, int j);

  5. int main(void) {
  6.     char *p[100];
  7.     char osaka[] = "Osaka", kyoto[] = "Kyoto", shiga[] = "Shiga",
  8.          nara[] = "Nara", hyogo[] = "Hyogo", wakayama[] = "Wakayama";
  9.     int i, j;
  10.     p[0] = osaka;
  11.     p[1] = kyoto;
  12.     p[2] = shiga;
  13.     p[3] = nara;
  14.     p[4] = hyogo;
  15.     p[5] = wakayama;
  16.     printStrs(p, 6);
  17.     while(1) {
  18.         printf("Input a pair of integers: ");
  19.         scanf("%d %d", &i, &j);
  20.         if(i < 0 || i > 5 || j < 0 || j > 5)
  21.             break;
  22.         swapStrs(p, i, j);
  23.         printStrs(p, 6);
  24.     }
  25.     return 0;
  26. }

  27. void printStrs(char **q, int n) {
  28.     printf("------ begin: print_string ------\n");
  29.     printf("0: %p %s\n", q[0], q[0]);
  30.     printf("1: %p %s\n", q[1], q[1]);
  31.     printf("2: %p %s\n", q[2], q[2]);
  32.     printf("3: %p %s\n", q[3], q[3]);
  33.     printf("4: %p %s\n", q[4], q[4]);
  34.     printf("5: %p %s\n", q[5], q[5]);
  35.     printf("------ end: print_string ------\n");
  36. }

  37. void swapStrs(char **q, int i, int j) {
  38.     char *temp;
  39.     temp = q[i];
  40.     q[i] = q[j];
  41.     q[j] = temp;
  42. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-10 00:24:29 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>
  2. #include <string.h>

  3. void printStrs(char **q, int n);
  4. void swapStrs(char **q, int i, int j);

  5. int main(void) {
  6.     char *p[100];
  7.     char osaka[] = "Osaka", kyoto[] = "Kyoto", shiga[] = "Shiga",
  8.          nara[] = "Nara", hyogo[] = "Hyogo", wakayama[] = "Wakayama";
  9.     int i, j;
  10.     p[0] = osaka;
  11.     p[1] = kyoto;
  12.     p[2] = shiga;
  13.     p[3] = nara;
  14.     p[4] = hyogo;
  15.     p[5] = wakayama;
  16.     printStrs(p, 6);
  17.     while(1) {
  18.         printf("Input a pair of integers: ");
  19.         scanf("%d %d", &i, &j);
  20.         if(i < 0 || i > 5 || j < 0 || j > 5)
  21.             break;
  22.         swapStrs(p, i, j);
  23.         printStrs(p, 6);
  24.     }
  25.     return 0;
  26. }

  27. void printStrs(char **q, int n) {
  28.     printf("------ begin: print_string ------\n");
  29.     printf("0: %p %s\n", q[0], q[0]);
  30.     printf("1: %p %s\n", q[1], q[1]);
  31.     printf("2: %p %s\n", q[2], q[2]);
  32.     printf("3: %p %s\n", q[3], q[3]);
  33.     printf("4: %p %s\n", q[4], q[4]);
  34.     printf("5: %p %s\n", q[5], q[5]);
  35.     printf("------ end: print_string ------\n");
  36. }

  37. void swapStrs(char **q, int i, int j) {
  38.     char *temp;
  39.     temp = q[i];
  40.     q[i] = q[j];
  41.     q[j] = temp;
  42. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-10 00:42:34 | 显示全部楼层

谢谢大佬,成功了。请问下这个是什么原因呀,我知道具体传址的时候只会传第一个字符好像,但是不知道这样改之后的具体原因
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-10 00:44:45 | 显示全部楼层
壳970527 发表于 2022-11-10 00:42
谢谢大佬,成功了。请问下这个是什么原因呀,我知道具体传址的时候只会传第一个字符好像,但是不知道这样 ...

你这是在做什么?
另外,把代码写好
  1. void swapStrs(char **q, int i, int j)
  2. {
  3. char temp;
  4. temp = *q;
  5. *q = *q[j];
  6. *q[j] = temp;
  7. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-10 00:52:08 | 显示全部楼层
人造人 发表于 2022-11-10 00:44
你这是在做什么?
另外,把代码写好

这个地方我想的就是把*q[i]中的值和*q[j]中的值互相交换- -
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-10 00:52:37 | 显示全部楼层
人造人 发表于 2022-11-10 00:44
你这是在做什么?
另外,把代码写好

谢谢大佬,以后会认真学习的,避免出现这些错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 06:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表