我正在自己学习C,为即将到来的学期学习做准备,并且想知道到目前为止我的代码出了什么问题。
如果事情看起来很奇怪,那是因为这是我正在创建的一个更大的排序函数的一部分,以便了解如何对数字,字母,数组等进行排序!我基本上在C语言中操纵弦乐时遇到了一些麻烦。
此外,我目前对C的了解非常有限!
我的主要成员包括:
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
int numbers[10];
int size;
int main(void){
setvbuf(stdout,NULL,_IONBF,0); //This is magical code that allows me to input.
int wordNumber;
int lengthOfWord = 50;
printf("How many words do you want to enter: ");
scanf("%i", &wordNumber);
printf("%i\n",wordNumber);
char words[wordNumber][lengthOfWord];
printf("Enter %i words:",wordNumber);
int i;
for(i=0;i<wordNumber+1;i++){ //+1 is because my words[0] is blank.
fgets(&words[i], 50, stdin);
}
for(i=1;i<wordNumber+1;i++){ // Same as the above comment!
printf("%s", words[i]); //prints my words out!
}
alphabetize(words,wordNumber); //I want to sort these arrays with this function.
}
我正在尝试构建的排序“方法”如下!这个功能存在严重缺陷,但我认为我会把这一切都告诉你写这篇文章时我的想法。
void alphabetize(char a[][],int size){ // This wont fly.
size = size+1;
int wordNumber;
int lengthOfWord;
char sortedWords[wordNumber][lengthOfWord]; //In effort for the for loop
int i;
int j;
for(i=1;i<size;i++){ //My effort to copy over this array for manipulation
for(j=1;j<size;j++){
sortedWords[i][j] = a[i][j];
}
}
//This should be kinda what I want when ordering words alphabetically, right?
for(i=1;i<size;i++){
for(j=2;j<size;j++){
if(strcmp(sortedWords[i],sortedWords[j]) > 0){
char* temp = sortedWords[i];
sortedWords[i] = sortedWords[j];
sortedWords[j] = temp;
}
}
}
for(i=1;i<size;i++){
printf("%s, ",sortedWords[i]);
}
}
我想我也有另一个问题...... 当我使用fgets()时,我正在做这个事情,我得到一个空字,用于数组的第一个点。我最近有其他问题尝试scanf()char []以某种方式特定地间隔我的输入字变量,这些变量“神奇地”摆脱了字符前的第一个空格。这方面的一个例子是使用scanf()编写“Hello”并获取“Hello”或“”“Hello”......
感谢对此的任何想法,我整个夏天都要学习,所以这不需要急速回答!另外,谢谢你将溢出作为一个整体在过去如此有用。这可能是我的第一篇文章,但过去几年我一直是常客,这是有用的建议/提示的最佳地点之一。
答案 0 :(得分:0)
您发现函数声明无效。您必须指定除第一个之外的数组的每个维度的大小,因此您可以编写:
void alphabetize(char a[][SOMESIZE], int size)
但是,您有一个非常量的第二维(因此您使用的是VLA或可变长度数组),这意味着您需要将两个大小都传递给函数,并在传递数组之前传递它们:
void alphabetize(int size, int length, char a[size][length])
然后调用它:
alphabetize(wordNumber, lengthOfWords, words);
当然,您也应该在尝试调用之前声明该函数。
可能还有其他问题需要解决,但这是一个突然出现的问题。例如,您需要使用size
和length
来控制函数中的循环。您可能不需要将数据复制到本地阵列(在这种情况下,您不需要本地阵列)。等
您应该考虑使用以下选项进行编译:
gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \
-Wold-style-definition -Wold-style-declaration -Werror …
请注意,请注意所有GCC版本都支持所有这些选项,但请使用支持的数量。
答案 1 :(得分:0)
你会喜欢这个 - 它是QSort的衍生物,适合你的情况。如果没有在这里或那里进行修改,它可能无法完美地工作(先测试!):
void qsort (Strings[], NumberOfItems)
{
char Temp[51]; // Assumes your max string length of 50
int I1 = 0; // Primary index
int I2 = 0; // Index + 1
int NumberOfItems_1 = 0;
bool Swapped = false;
do // Outer loop
{
Swapped = false;
// Decrement our limit
NumberOfItems--;
// Save time not performing this subtraction many times
NumberOfItems_1 = NumberOfItems - 1;
// Repeatedly scan the list
for (I1 = 0; I1 < NumberOfItems_1; I1++)
{
// Save time not performing this addition many times
// I1 points to the current string
// This points to the next string
I2 = I1 + 1;
// If the current string is greater than the next string in the list,
// swap the two strings
if (strcmp(Strings[I1], Strings[I2]) > 0)
{
strcpy (Temp, Strings[I1]);
strcpy (Strings[I1], Strings[I2]);
strcpy (Strings[I2], Temp);
Swapped = true;
}
}
}
while (Swapped); // Break out when we've got nothing left to swap
}
答案 2 :(得分:0)
我发现你的代码发生了一些问题。首先,你将sortedWords声明为一个多维数组(因为你有sortedWords [wordnumber] [lengthofword],但你稍后尝试使用它只有一个索引..这不起作用!另外,你传递2D数组是无效。请查看此帖子,了解传递2D数组的有效方法:Passing a 2D array to a C++ function