如何动态创建字符串数组,同时从数组条目中删除空格?

时间:2014-02-11 19:53:43

标签: c arrays string malloc

基本上,我希望我的代码的这一部分从输入的第一行读取句子的数量,然后是句子本身,并将它们存储在数组中(即使输入可以包含空格,最后的数组条目可能不是,而不是大写字母)。 对于以下输入

3
one two three
four five six (program didn't let me input another line, but just two more for the sake of the example.)
stack over flow

我想要以下输出

onetwothree
fourfivesix
stackoverflow

资本化尚未实施,但我认为这并不难。 用我的代码:

void main(){
int length1, length2,i,n;

scanf("%d", &length1);
char *sentenceArray1[length1];
char tempString[100000];
/*The array for storing the first set of sentences, and a temporary string used
for allocating memory in the next loop*/
for(i=0;i<=length1;i++){
        fgets(tempString, 100000, stdin);
        sentenceArray1[i]=malloc((strlen(tempString))*sizeof(char));
        sentenceArray1[i]=tempString;
        for(n=0;n<(strlen(tempString));n++){
                if(tempString[n]==' '){
                        sentenceArray1[i][n]=tempString[n+1];
                        n++;
                }
        printf("%s",sentenceArray1[i]);
        }

}

我的实际输出如下:

one two three
one two three
one two three
onettwo three
onettwo three
onettwo three
onettwotthree
onettwotthree
onettwotthree
onettwotthree
onettwotthree
onettwotthree

如果标记偏离,我很抱歉,这是我第一次发帖。

1 个答案:

答案 0 :(得分:1)

请考虑以下事项:

<强>代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STR_LEN (100000)

int main(void)
{
    int numStrings, tempIndex, modIndex, numSpaces;
    char tempString[MAX_STR_LEN];

    printf("Enter number of strings: ");
    scanf("%d", &numStrings);

    while(getchar() != '\n')
        continue;

    char **modifiedStrings = malloc(numStrings * sizeof(*modifiedStrings));

    for(int i = 0; i < numStrings; i++)
    {
        printf("Enter string %d: ", i + 1);
        fgets(tempString, MAX_STR_LEN, stdin);

        tempIndex = numSpaces = 0;
        while(tempString[tempIndex] != '\n')
        {
            if(tempString[tempIndex++] == ' ')
                numSpaces++;
        }

        modifiedStrings[i] = malloc(strlen(tempString) - numSpaces + 1);

        tempIndex = modIndex = 0;
        while(tempString[tempIndex] != '\n')
        {
            if(tempString[tempIndex] != ' ')
                modifiedStrings[i][modIndex++] = tempString[tempIndex];

            tempIndex++;
        }
        modifiedStrings[i][modIndex] = '\0';
    }

    for(int i = 0; i < numStrings; i++)
        printf("%s\n", modifiedStrings[i]);

    return 0;
}

<强>逻辑

  1. 找出要输入的字符串数。将它们存储在变量(numStrings)中。
  2. 删除'\n'留下的换行符(scanf)。
  3. 创建一个char *数组,每个字符串将输入一个元素。
  4. 获取每个字符串。将其存储到临时char数组(tempString)。
  5. 计算临时' '字符串中的空格数(char)。
  6. malloc只有足够的内存来满足您的需求。
  7. 将每个字符从临时字符串复制到新字符串(modifiedStrings[i]),跳过空格。
  8. NULL'\0')附加到新char数组的末尾以使其成为字符串。
  9. 高五人。
  10. 待办事项

    1. 检查错误。
    2. 运行示例

        

      输入字符串数:3
        输入字符串1:一二三   输入字符串2:四五六   输入字符串3:堆叠流量
        onetwothree
        fourfivesix
        stackoverflow