我很确定它与我使用calloc()有关,但我不明白为什么。该计划的目标是让char* C
包含不在char* A
中的char* B
字符。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char* diff(char* A, char*B);
int main() {
char* A = {'q','g','e','\0'};
char* B = {'a','d','e','\0'};
char* C = diff(A,B);
printf("%s", C);
free(C);
return(0);
}
int search(char* S, char c) {
int i=0;
while( S[i]!='\0' ){
if( S[i]==c ) break;
i++;
}
if( S[i]=='\0' ) return -1;
else return i;
}
char* diff(char* A, char* B) {
int i;
char* C = calloc(strlen(A), sizeof(char));
assert(C != NULL);
int lengthC = 0;
for (i = 0; i < strlen(A); i++) {
if (-1 != -1) {
C[lengthC] = A[i];
lengthC++;
}
}
C[lengthC] = '\0';
return C;
}
char*
指针的初始化可能如下所示:
char *A = { (char*)(void*)(uintptr_t)5 };
这将把文字值5
指定为A
指针的值。 A
指针将指向(可能)无效的内存位置。
转换(char*)(void*)(uintptr_t)
(或稍微类似的转换)可以由编译器隐式地完成。编译器发出至少一个关于从整数到指针的隐式转换的警告是很好的。
你也可以“超出”{
}
括号内的元素数量。即:
char* A = { 1, 2, 3, 4, 5, };
数字2, 3, 4, 5,
被忽略,因为char*
可能只从一个值初始化。
编译器应该警告你那些,例如。在gcc我得到:
<source>:6:16: warning: incompatible integer to pointer conversion initializing 'char *' with an expression of type 'int' [-Wint-conversion]
char* A = {'q','g','e','\0'};
^~~
<source>:6:20: warning: excess elements in scalar initializer
char* A = {'q','g','e','\0'};
所以:
char* A = {'q','g','e','\0'};
等于:
char *A = 113;
根据q
,ascii table等于113。
113
是一个无效的指针。稍后在您的代码中执行:
strlen(A)
它试图访问A
指针后面的内存。由于指针无效,因此未定义会发生什么。在您的系统上,您会出现分段错误。
A
变量应该可以更改为数组:
char A[] = {'q','g','e','\0'};
或者等同于:
char A[] = "qge";
这将创建一个字符数组并使用适当的值初始化它们。
您无法以这种方式初始化指针。 char * A = {'q','g','e','\ 0'};它可能似乎在一些编译器上编译,初始化这种方式是错误的。请记住,指针变量就像整数数据类型。它实际上包含一个包含内存位置地址的整数值。
相反它应该被视为数组:char A = {'q','g','e','\ 0'};数组名称本身在C中表现为指针(当然有一些限制),因此您将数组名称本身作为参数传递给函数。
其次考虑你的程序目标:char * C包含不在char * B中的char * A字符,
声明如果(-1!= -1)看起来像一个错字错误,我想你的意思
if(搜索(B,A [i])== -1)
在calloc调用时可能还需要一个类型转换,因为它返回void *
char * C =(char *)calloc(strlen(A),sizeof(char));
考虑到所有这些,下面的程序将实现您的目标:
希望这可以帮助 :)
int main() {
char A[] = { 'q','g','e','\0' };
char B[] = { 'a','d','e','\0' };
char* C = diff(A, B);
printf("%s", C);
free(C);
return(0);
}
int search(char* S, char c) {
int i = 0;
while (S[i] != '\0') {
if (S[i] == c) break;
i++;
}
if (S[i] == '\0') return -1;
else return i;
}
char* diff(char* A, char* B) {
int i;
char* C = (char *) calloc(strlen(A), sizeof(char));
assert(C != NULL);
int lengthC = 0;
for (i = 0; i < strlen(A); i++) {
if (search(B,A[i]) == -1) {
C[lengthC] = A[i];
lengthC++;
}
}
C[lengthC] = '\0';
return C;
}