繁体   English   中英

从C中的另一个字符串中删除字符串的出现(代码和错误消息)

[英]Removing Occurences of String from another in C (Code and Error Messages)

有人可以告诉我我的代码有什么问题吗? 我已经广泛查看了VS给我的错误消息,但我很茫然。 我已附上错误消息以获取更多信息。

//Inclusion of necessary header files
#include <stdio.h>
#include <string.h>

//String Removal function prototype
char str_check(char *, char *);
void str_remove(char*, char*);
int isPrefix(char* list1, char* list2);
//Entry point for header files, pre-processor directives, and function prototypes
int main()
{
    //Necessary variable declarations
    char list1[500];
    char list2[20];

    //Input prompt and input function for first string
    printf("Please enter a string of up to 500 characters for first array.\n");
    *list1 = getchar();

    //Input prompt and input function for second string
    printf("Please enter a string of up to 20 characters for second array.\n");
    *list2 = getchar();

    //String Removal function call assigns function output to a third array and uses string function to display output
    *list1 = str_check(list1, list2);
    puts(list1);

    //Exit sequence
    return 0;
}

//String check function definition
char str_check(char* list1, char* list2)
{
    //Temporary character pointer declarations and for loop control variables
    char *ptr1=list1, *ptr2=list2;
    int i, j, k;

    //Loop checks both array elements for concurrent characters using isPrefix function, checks for concurrent string segments if one is found, call string removal function
    for (i = 0; i < strlen(list1); i++)
    {
        if (isPrefix(ptr1+i, ptr2)==1)
        {
            str_remove(ptr1+i, ptr2);
        }

    }

    return;
}

//isPrefix function definition checks for string occurences
int isPrefix_1 (char* ptr1, char* ptr2){

    int i=0;

    while(*(ptr1 + i) != '\0')
    {
        if(*(ptr1 + i) != *(ptr2 + i))
        {
            return 0;
        }
        i++;
    }

    return 1; 
}


void str_remove(char* ptr1, char* ptr2)
{
    int offset = strlen(ptr2);
    int i=0;
    for(i=0;i<(strlen(ptr1)-strlen(ptr2));i++)
    {
        *(ptr1+i) = *(ptr1+i+offset);
    }
    *(ptr1+i+offset) ='\0';
}

ERROR MESSAGES:
: warning C4018: '<' : signed/unsigned mismatch
: warning C4033: 'str_check' must return a value
: warning C4101: 'k' : unreferenced local variable
: warning C4101: 'j' : unreferenced local variable
: warning C4018: '<' : signed/unsigned mismatch
: warning C4716: 'str_check' : must return a value
: fatal error LNK1120: 1 unresolved externals
  1. 警告C4018:“ <”:有符号/无符号不匹配

我不确切知道此警告在哪行,但我认为它在这里:

for (i = 0; i < strlen(list1); i++)

strlen返回一个size_t变量,它是一个unsigned int 您正在将其与带符号变量进行比较,这可能会给您带来一些麻烦。 例如,考虑以下声明:

int a = -1;
unsigned int b = 100;

比较a < b将为假。 这是因为a强制转换为无符号,并且由于表示负数的方式(通常是二进制补码 )。 但是,对于您而言,这将不是问题。 为避免收到警告,请将i声明为unsigned int

  1. 警告C4033:“ str_check”必须返回一个值

str_check的声明为:

char str_check(char* list1, char* list2);

但是,您不会在此函数的定义中返回任何char 您要么应该声明它为void str_check(char* list1, char* list2); ,否则您应该已经从中返回了一些价值。

  1. 警告C4101:“ k”:未引用的局部变量

这很简单:您已经声明了变量k并且没有使用它。


它们的其余部分与上述重复(最后一个除外)。 除了第二个警告(可能会导致一些意外的行为)外,该程序应该可以正常运行。

最后一个错误是您的问题。 我将尝试为您提供有关错误含义的背景知识,并希望对您有所帮助。

您有一个源代码。 为了从中创建可执行文件,必须采取一些步骤:

  1. 预处理。

在此步骤中,将分析预处理程序指令。 就您而言,您可以使用#include指令包含一些文件。 当预处理器遇到此指令时,它只是将该文件的内容复制到您的文件中。

  1. 汇编。

此步骤将为您的程序生成实际的目标代码 (CPU可以理解的代码)。 但是,有些函数(如getchar尚未提供任何定义。 它们已经在库中编译。

  1. 链接。

链接器的工作是链接与所需要的库的最后一步生成的目标代码,所以您使用的所有功能都可以调用。 此步骤将产生您的错误。 它基本上说它找不到对某事物的引用。 在这里,您将找到有关此错误的一些文档:

“ 1个无法解析的外部组件” C ++ http://support.microsoft.com/kb/815650 http://www.dreamincode.net/forums/topic/22701-fatal-error-lnk1120-1-unresolved-externals/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM