我已经研究了一段时间(在C中)并且无法解决这个问题.我有一个包含字符数组的缓冲区.我已经使用qsort对数组进行排序,现在它们都处于正确的顺序.我现在需要删除重复项(或者只打印出没有重复的列表).有一点需要注意:字符被分为N个字符组(用户给出的N).所以它不仅仅是将一个字母与另一个字母进行比较; 它将它们的组相互比较.
例如:如果输入是AADDBBEECCEE并且用户给出的N是2,则结果将是AABBCCDDEE(其中一个EE已被删除).
我知道我必须使用memcmp,但我对语法感到困惑.我尝试着:
i=0;
int result;
int k;
while(i<bufferSize-nValue){
result = memcmp(buffer[i], buffer[i+nValue], nValue);
if(result==0){
i=i+nValue;
}
else{
for(k=0; k<nValue; k++){
printf("%c",buffer[i]);
i++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
其中buffer是数组,nValue是N,bufferSize是数组中元素的总数.运行代码时我不断出现分段错误.
谢谢大家的帮助!
我似乎无法让qsort在我的问题中工作.我环顾四周,我的代码应该是正确的.
int file::compare (const void * a, const void * b)
{
fileinfo* fa = (fileinfo*)a;
fileinfo* fb = (fileinfo*)b;
return (*(int*)fa->inode - *(int*)fb->inode);
}
void file::print()
{
qsort((void *)files, 100, sizeof(fileinfo), compare);
}
Run Code Online (Sandbox Code Playgroud)
files是一个fileinfo数组.struct fileinfo是一个包含文件名称和inode的结构.
我正在尝试为qsort的比较器创建一个内联函数 - 类似这样:
function<int(int,int)> comparesort = [smarkers, emarkers, strSearch] (int *arg1, int *arg2) { return 0; };
qsort(sortptrs, nKeywords, sizeof(int), comparesort);
Run Code Online (Sandbox Code Playgroud)
它给了我这个错误
IntelliSense:没有合适的转换函数,从"std :: tr1 :: function"到"int(__ cdecl*)(const void*,const void*)"存在
好的 - 我把它改成了这个
auto comparesort = [sortptrs, smarkers, emarkers, strSearch] (int arg1, int arg2)
{
int a = 0;
.
.
.
return a;
};
std::sort(sortptrs, sortptrs + nKeywords, comparesort);
Run Code Online (Sandbox Code Playgroud)
并且它给出了一个错误:
错误C3499:已指定具有void返回类型的lambda无法返回值
[编辑于7月30日下午3:55]
我实际上需要一个指针排序 - 我有一个单词的开始和结束字节数组(在从VB.Net托管代码传入的字符串中找到).我还有一个包含"1,2,3 ..."的指针数组,我需要对指针进行排序.
似乎我不能用std :: sort这样做,所以我实现了自己的shell排序......
我有一份工作,我现在已经工作了几个小时,我似乎无法做到这一点.赋值是从一个随机数量的名称(来自stdin),对它们进行排序,然后按字母顺序输出它们.我找不到任何专门处理这种排序的网站,并且没有运气试图在我的代码中实现qsort().
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int stringcmp(const void *a, const void *b)
{
const char **ia = (const char **)a;
const char **ib = (const char **)b;
return strcmp(*ia, *ib);
}
void main(int argc, char *argv[])
{
char *input[] = {" "};
char temp[20][20];
int i = 0;
int num = 0;
int place = 0;
int stringlen = sizeof(temp) / sizeof(char);
printf("How many names would you like to enter? ");
scanf("%d", &num);
while (place < num)
{ …Run Code Online (Sandbox Code Playgroud) 使用qsort()VS2008中的stdlib实现.
这个实现qsort()在堆上使用内存吗?或者只使用基于堆栈的内存?
在下面的代码中,一旦我删除了比较字符串的注释部分,我就会遇到seg 11错误.我无法理解为什么!其余的代码工作正常.任何帮助表示赞赏!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare_scores_desc(const void* scorea, const void* scoreb){
int a = *(int*)scorea;
int b = *(int*)scoreb;
return a-b;
}
int compare_names(const void* namea, const void* nameb){
char** a = *(char**)namea;
char** b = *(char**)nameb;
return strcmp(*a,*b);
}
int main(int argc, char* argv[]){
int scores[7] = {456,234,65,563,67,19,100};
int i;
qsort(scores,7,sizeof(int),compare_scores_desc);
puts("\nThese are the scores in order : \n");
for(i=0;i<7;i++)
printf("%i\n",scores[i]);
char *names[] = {"Krishna","Rama","Bhishma","Arjuna"};
/*qsort(names,4,sizeof(char*),compare_names);*/
puts("------------------");
puts("The names in order are : \n");
for(i=0;i<4;i++) …Run Code Online (Sandbox Code Playgroud) 我正在学习C而且我正在解决这个挑战,我不打算将它提交给uva平台,而我编写这个练习的原因是为了倾斜,也许这不是解决问题的最佳方法,但我我正在努力.
我在终端中打印的输入如下:
4
3
20 30 40 50 30 40
Res: 2
4
20 30 10 10 30 20 40 50
Res: 4
3
10 30 20 20 30 10
Res: 2
4
10 10 20 30 40 50 39 51
Res: 3
Run Code Online (Sandbox Code Playgroud)
每个输入测试的答案都是错误的,我相信原因是qsort函数.我混淆了如何使用结构使用qsort函数,我正在调用我的结构,称为数组,然后是我输入的大小,然后使用sizeof(int)但是我需要使用int或sizeof my结构,最后我正在调用我的比较函数.我的代码是:
#include <stdio.h>
#include <string.h>
struct Dolls{
int w;
int h;
}array[20005];
int cmp(struct Dolls a, struct Dolls b){
if(a.w==b.w){
return a.h < b.h;
}else{
return a.w > b.w;
}
}
int arr[20005];
int …Run Code Online (Sandbox Code Playgroud) 相关代码(索引是数组的大小):
typedef struct elemento {
unsigned long linha;
unsigned long coluna;
double valor;
} elemento;
elemento Representados[MAXN];
qsort(Representados, index, sizeof(Representados[0]), lcomparator);
int lcomparator(const void *el1, const void *el2) {
int l1 = ((elemento *)el1)->linha;
int l2 = ((elemento *)el2)->linha;
int c1 = ((elemento *)el1)->coluna;
int c2 = ((elemento *)el2)->coluna;
if (l1 < l2) {
return -1;
}
else if (l1 == l2) {
if (c1 < c2) {
return -1;
}
else if (c1 == c2) {
return 0;
} …Run Code Online (Sandbox Code Playgroud) 我确实有些奇怪的事情.我想在国际象棋棋盘上按颜色对许多元素进行排序.这很容易(参见附件代码),所以如果x%2 == y%2为真,那么它是黑色的,如果不是白色的话.但那不是问题.我在数组的前面有一个元素,这有点不同(以后需要进行一些计算)并且需要保持原样.
是否可以在不触及第一个元素的情况下对数组进行排序?
int compareColour(const void * fs1, const void * fs2) {
Field *orderA = (Field *)fs1;
Field *orderB = (Field *)fs2;
bool isBlackB = ((orderA->x%2)==(orderA->y%2));
bool isBlackA = ((orderB->x%2)==(orderB->y%2));
return (isBlackB - isBlackA);
}
void sortByColour() {
qsort(fieldArr,(size_t) countFields, sizeof(Field), compareColour);
}
Run Code Online (Sandbox Code Playgroud) Why doesn't the code below sort the month names? Base address is correct, number of elements is correct, size of each element is correct, cmp function is correct. gcc -W -Wall -ansi -pedantic doesn't complain a peep.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int by_name(const void *a, const void *b) {
fprintf(stderr, "%p %p\n", a, b);
return strcmp((const char *)a, (const char *)b);
}
int main(void) {
char *months[] = {
"January",
"Februar",
"March",
"April",
"May",
"June",
"July",
"August",
"September", …Run Code Online (Sandbox Code Playgroud)