多个分隔符的代码计算不起作用

时间:2015-05-13 21:02:29

标签: c arrays string delimiter

我有一个程序,我写了一个单词,并根据出现的分隔符,分隔每个单词并将其添加到一个数组。

我已对其进行了调整,以便考虑到' ' ,'。'或者'。'。现在的目标是调整出现在一起的多个分隔符(如在"狗,,,步行")并且仍然只添加单词。虽然我的程序有效,并且它没有打印出额外的分隔符,但每次遇到其他分隔符时,它会在输出中包含一个空格而不是忽略它们。

int main(int argc, const char * argv[]) {

    char *givenString = "USA,Canada,Mexico,Bermuda,Grenada,Belize";

    int stringCharCount;

    //get length of string to allocate enough memory for array
    for (int i = 0; i < 1000; i++) {
        if (givenString[i] == '\0') {
            break;
        }
        else {
            stringCharCount++;
        }
    }



    // counting # of commas in the original string
    int commaCount = 1;
    for (int i = 0; i < stringCharCount; i++) {
        if (givenString[i] == ',' || givenString[i] == '.' || givenString[i] == ' ') {
            commaCount++;
        }
    }


    //declare blank Array that is the length of commas (which is the number of elements in the original string)
    //char *finalArray[commaCount];



    int z = 0;
    char *finalArray[commaCount] ;
    char *wordFiller = malloc(stringCharCount);


    int j = 0;
    char current = ' ';

    for (int i = 0; i <= stringCharCount; i++) {

        if (((givenString[i] == ',' || givenString[i] == '\0' || givenString[i] == ',' || givenString[i] == ' ') && (current != (' ' | '.' | ',')))) {
            finalArray[z] = wordFiller;
            wordFiller = malloc(stringCharCount);
            j=0;
            z++;
            current = givenString[i];
        }

        else {
            wordFiller[j++] = givenString[i];
        }
    }


    for (int i = 0; i < commaCount; i++) {
        printf("%s\n", finalArray[i]);
    }
    return 0;
}

这个程序花了我几个小时的时间聚在一起(在更有经验的开发人员的帮助下),我无法帮助但是感到沮丧。我使用调试器达到了我的最佳能力,但绝对需要更多的经验。

/////////

我回到了垫和纸上,重写了我的代码。现在我试图在数组中存储分隔符,并将该数组的元素与当前字符串值进行比较。如果它们相等,那么我们会遇到一个新单词并将它添加到最终的字符串数组中。我正在努力弄清楚&#34; for&#34;的位置和内容。我将用于此循环。

    char * original = "USA,Canada,Mexico,Bermuda,Grenada,Belize";

    //creating two intialized variables to count the number of characters and elements to add to the array (so we can allocate enough mmemory)
    int stringCharCount = 0;
    //by setting elementCount to 1, we can account for the last word that comes after the last comma
    int elementCount = 1;

    //calculate value of stringCharCount and elementCount to allocate enough memory for temporary word storage and for final array
    for (int i = 0; i < 1000; i++) {
        if (original[i] == '\0') {
            break;
        }
        else {
            stringCharCount++;
            if (original[i] == ',') {
                elementCount++;
            }
        }
    }

    //account for the final element
    elementCount = elementCount;

    char *tempWord = malloc(stringCharCount);
    char *finalArray[elementCount];
    int a = 0;
    int b = 0;
    //int c = 0;
    //char *delimiters[4] = {".", ",", " ", "\0"};

        for (int i = 0; i <= stringCharCount; i++) {
            if (original[i] == ',' || original[i] == '\0') {
                finalArray[a] = tempWord;
                tempWord = malloc(stringCharCount);
                tempWord[b] = '\0';
                b = 0;
                a++;
            }
            else {
                tempWord[b++] = original[i];
            }
            }

    for (int i = 0; i < elementCount; i++) {
        printf("%s\n", finalArray[i]);
    }
    return 0;
}

2 个答案:

答案 0 :(得分:0)

很多问题。建议将代码分成小块并先调试它们。

-

取消初始化数据。

// int stringCharCount;
int stringCharCount = 0;
... 
stringCharCount++;

或者

int stringCharCount  = strlen(givenString);

其他问题:finalArray[]永远不会被分配一个终止空字符但仍然使用printf("%s\n", finalArray[i]);

不清楚使用char *

char *wordFiller = malloc(stringCharCount);

wordFiller = malloc(stringCharCount);

答案 1 :(得分:0)

代码中的行数多于行数。

我建议你从更简单的事情开始。

通过练习编写基本编程手册。

修改

或者,如果这是关于学习编程,请尝试另一种更简单的编程语言:

C#中,您的任务看起来很简单:

string givenString = "USA,Canada Mexico,Bermuda.Grenada,Belize";
string [] words = string.Split(new char[] {' ', ',', '.'});
foreach(word in words)
    Console.WriteLine(word);

如您所见,有许多问题需要担心:

  • 没有内存管理(alloc / free)这是由垃圾收集器
  • 处理的
  • 没有指针,所以没有任何问题可以解决它们
  • 强大的内置字符串功能,例如Split()
  • foreach使循环更简单