c - 如何从函数 void zamiana Wierszy(...) 返回主函数?

标签 c string

我的代码没有从下面的函数 zamianaWierszy 返回:

#include"stdio.h"
#include"string.h"
#include"stdlib.h"

void zamianaWierszy(int pierwszy, int drugi,char*tabstat[]) {
    char*pamietajPierwszy;

    size_t rozmiarTab = strlen(*tabstat);
    pamietajPierwszy = tabstat[pierwszy - 1];
    tabstat[pierwszy - 1] = tabstat[drugi - 1];
    tabstat[drugi - 1] = pamietajPierwszy;

    for (int i = 0; i < rozmiarTab; i++) {
        puts(tabstat[i]);
    }
}

int main()
{
    int pierwszy, drugi, pusty;

    char *tabstat[] = {
        (char*)"abcde",
        (char*)"fghi",
        (char*)"jklmn",
        (char*)"koder"
    };
    printf("Podaj wybrane wiersze,które chcesz przestawić:");
    scanf("%d %d", &pierwszy, &drugi);
    zamianaWierszy(pierwszy, drugi, tabstat);

    printf("Podaj po którym wierszu chcesz wstawić pusty wiersz:");
    scanf("%d", &pusty);
    pustyWiersz(pusty, tabstat);
    return 0;
}    

我在 main.c 中没有看到 printf("Podaj po którym wierszu chcesz wstawić pusty wiersz:") 的输出。

最佳答案

您的代码有很多不正确的地方,主要是:

  • 检查 scanf 的结果,或者您可能已经初始化了 pierwszydrugi 的值
  • 如果 pierwszy 为 0 或负数,这将覆盖调用函数的堆栈帧:tabstat[pierwszy - 1] = ...
  • 如果 drugi 为 0 或负数,这将覆盖调用函数的堆栈帧:tabstat[drugi - 1] = ...
  • rozmiarTab 将包含第一个字符串的大小 (5),而不是 tabstat 中应有的字符串数量。因此,您的 for 循环将访问额外的超出范围的项目。但是,这可能会打印一些垃圾或崩溃,但不太可能影响函数的返回地址。

当覆盖调用者堆栈帧时,您可能会覆盖函数的返回地址,并且没有人知道您的函数可以返回到哪里...:)

因此,您需要检查scanf的返回值以及pierwszydrugi的值,并修复的值rozmiarTab.

关于c - 如何从函数 void zamiana Wierszy(...) 返回主函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55534686/

相关文章:

嵌入式世界中的 C 文件函数

C++将字符串转换为int

java - 正确格式化日期

python - 只从字符串 python 3 中删除一个字符一次

python - 将字符串列表从 python/ctypes 传递到期望 char 的 C 函数**

c - 从C中的动态数组回收内存

python - 根据子字符串拆分列表

java - 无法获取字符串拆分中的正则表达式示例

c - 我该如何解决这个问题

c - 如何从客户端向服务器发送无效密码?