【问题标题】:implicit declaration of function ‘strrev’ [duplicate]函数'strrev'的隐式声明[重复]
【发布时间】:2014-10-28 21:35:02
【问题描述】:

关于为什么我尝试编译 代码以检查文件 atadata 中的一行是否收到警告的任何想法:

warning: implicit declaration of function ‘strrev’ [-Wimplicit-function-declaration]

代码

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

int main(){
    char palindromes[100];
    char reverse[100];
    FILE *atadata = fopen("atadata","r");
    while (fgets(palindromes,sizeof(palindromes),atadata) != NULL){
        strcpy(reverse,palindromes);
        strrev(reverse);
        if( strcmp(atadata,reverse) == 0)
        fputs(atadata, stdout);
    }
    fclose(atadata);
    return 0;
}

【问题讨论】:

  • string.h中是否有定义?
  • 没有strrev,除非你写过一个。 (那么你需要在声明中包含标题)
  • 另请注意 fget 包含换行符。
  • @DavidC.Rankin - 我的意思是声明,但我累了:(
  • @SeanO'Brien 打开文本编辑器,输入必要的代码,将其保存为文本文件并使用 C 编译器进行编译。

标签: c palindrome implicit-declaration


【解决方案1】:

如果你在 Linux 中编译,那么strrev() 就是not part of string.h。链接的问题包含一个 answer 链接到实现的源代码,您可以直接将其引入您自己的代码中。

【讨论】:

【解决方案2】:
char *strrev(char *str){
    char c, *front, *back;

    if(!str || !*str)
        return str;
    for(front=str,back=str+strlen(str)-1;front < back;front++,back--){
        c=*front;*front=*back;*back=c;
    }
    return str;
}

【讨论】:

  • 为我工作。 !
【解决方案3】:

如果其他一些代码难以阅读或者您不知道如何使用指针,这里有一个简短的脚本来反转字符串。

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

int main(void)
{
// Start here
char String1[30] = "Hello",reversed[30];
int i;
long int length = strlen(String1);

//Reverse string
for(i=0; i<length; ++i)
{
    reversed[length-i-1] = String1[i];
}

printf("First string %s\n",String1);
printf("Reversed string %s\n",reversed);

// To here if you want to copy and paste into your code without making functions 
return 0;
}

【讨论】:

  • 这是朋克的可读编码风格。我喜欢简单。
【解决方案4】:

一个能满足您的需要并能高效运行的函数将采用以下形式:

/** strrev - reverse string, swaps src & dest each iteration.
*  Takes valid string and reverses, original is not preserved.
*  If str is valid, returns pointer to str, NULL otherwise.
*/
char *
strrev (char *str)
{
    if (!str) { 
        fprintf (stderr, "%s() Error: invalid string\n", __func__); 
        return NULL; 
    }

    char *begin = str;
    char *end = *begin ? str + strlen (str) - 1 : begin;  /* ensure non-empty */
    char tmp;

    while (end > begin)
    {
        tmp = *end;
        *end-- = *begin;
        *begin++ = tmp;
    }

    return str;
}

【讨论】:

  • 随机效用函数在没有明确指示的情况下向stdout/stderr 投诉是个坏主意。
  • 我尝试过分包容,至少让函数在收到无效输入时发出噪音。我同意您关于错误处理的前提,但是提供错误处理程序以及示例函数保证会弄得一团糟。
  • char *end = str + strlen (str) - 1; : if strlen(str)==0 , end = &amp;str[-1].. UB.
  • 如果您认为输入无效(并决定检查它),然后在投诉后abort() 而不是return 0
猜你喜欢
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 2022-01-16
相关资源
最近更新 更多