微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么当我调用函数时我的程序会停止?

如何解决为什么当我调用函数时我的程序会停止?

我正在编写一个函数,它应该反转给定的单词或输入,但是当我调用它时程序一直停止。

代码是:

nl2br($cakeOrdering->escape($blog['content']));

程序停止的那一行是#include <stdio.h> #define MAX 1000 void reverse(char normal[],char reversed[]); main() { int c,i; char line[MAX],reversed_line[MAX]; for (i=0; (c = getchar()) != EOF && c != '\n'; i++) { line[i] = c; if (c == '\n') i++; } line[i] = '\0'; copy(line,reversed_line); printf("%s",reversed_line); return 0; } void reverse(char normal[],char reversed[]) { int i,len; for (i = 0; normal[i] != '\0'; i++) len++; i = 0; while ((reversed[len-i] = normal[i]) != '\0') i++; } ,它给出的错误copy(line,reversed_line);

任何帮助将不胜感激

解决方法

首先你不执行你的程序只是尝试编译和链接它。

错误消息表明链接失败,因为链接器没有找到函数 copy,它确实从未在您的代码中定义。标准库中没有“复制”功能。如果您想复制字符串或某些内存区域,您应该使用 strcpystrncpymemcpymemmove

但即使程序链接你的代码也有很多问题。

这是程序的工作版本:

#include <stdio.h>
#define MAX 5

char *reverse(char *normal,char *reversed);

int main(void) {

    int c;
    size_t i = 0;
    char line[MAX],reversed_line[MAX];

    while((c = getchar()) != EOF)
    {
        line[i] = c;
        if(c != '\n') i++;
        if(i >= MAX - 1) break;
    }
    line[i] = '\0';

    reverse(line,reversed_line);
    printf("%s",reversed_line);

    return 0;
}

char *reverse(char *normal,char *reversed) 
{
    size_t size = 0;

    if(normal && reversed)
    {
        while(normal[size]) size++;
        reversed[size] = 0;
        while(size)
        {
            reversed[size - 1] = *normal++;
            size--;
        }
    }
    return reversed;
}

https://godbolt.org/z/jb7b6hjfT

,

对于这个 for 循环中的初学者

for (i=0; (c = getchar()) != EOF && c != '\n'; i++) {
    line[i] = c;
    if (c == '\n')
        i++;
}

您不是在检查 i 是否大于或等于 MAX。而且这个 if 语句

    if (c == '\n')
        i++;

由于循环条件而永远不会执行。

您声明了函数 reverse

void reverse(char normal[],char reversed[]);

但您尝试调用的不是该函数,而是另一个函数 copy

copy(line,reversed_line);

函数 reverse 中的这个循环也是如此

while ((reversed[len-i] = normal[i]) != '\0')
        i++;

正在尝试在参数 '\0' 指向的字符数组的第一个位置写入终止零字符 reversed

您需要的是以下内容

#include <stdio.h>

#define MAX 1000

char * reverse_copy( const char normal[],char reversed[] );

int main(void) 
{
    char line[MAX],reversed_line[MAX];

    size_t i = 0;
    
    for  ( int c; i + 1 < MAX && ( c = getchar() ) != EOF && c != '\n'; i++ ) 
    {
        line[i] = c;
    }
    
    line[i] = '\0';
    
    puts( reverse_copy( line,reversed_line ) );
    
    return 0;
}

char * reverse_copy( const char normal[],char reversed[] ) 
{
    size_t len = 0;

    while ( normal[len]  != '\0' ) ++len;

    reversed += len;
    
    *reversed = '\0';
    
    for ( ; len != 0; --len )
    {
        *--reversed = *normal++;
    }

    return reversed;
}

如果输入例如字符串

Hello World!

那么程序输出将是

!dlroW olleH
,

您在代码中做了一些不必要的事情。例如,当您已经知道长度时,为什么在 reverse 中的 while 循环中有这个条件?

while ((reversed[len - i] = normal[i]) != '\0')

我重写了您的整个代码以优化某些内容。也许它是对 0___________'s answer 的有用补充。我在代码中包含了很多解释性注释。

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

#define MAX 1000

void reverse(char *str,char *rev_str,size_t len)
{
    /* check if `str` is a valid string */
    if (str == NULL) {
            fprintf(stderr,"Error: invalid string\n");
            exit(EXIT_FAILURE);
    }

    /* take null character into account */
    for (int i = 0; i < len - 1; ++i)
            rev_str[len - i - 2] = str[i];
    rev_str[len - 1] = '\0';
}

int main(void)
{
    char str[MAX];
    fputs("Input: ",stdout);
    /* just use `fgets` and prevent buffer overflow */
    fgets(str,MAX,stdin);

    /* `len` includes null character */
    size_t len = strlen(str);
    /* change '\n' to '\0' */
    str[len - 1] = '\0';

    /* `sizeof(rev_str)` doesn't always need to be `MAX` */
    char rev_str[len];
    reverse(str,rev_str,len);
    printf("Output: %s\n",rev_str);

    return EXIT_SUCCESS;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。