使用空格char进行数组操作;迭代

时间:2015-05-21 14:19:37

标签: c arrays

我正在编写一个接收数组和整数x的程序。对于数组中的每个单词(text [i]!=''),程序应将单词缩减为x整数并将其应用于所有单词。 E.g。

如果用户写“Hello Im Kevin”并定义x = 2,程序应该返回“他是我”。

这就是我现在所拥有的,但它只适用于第一个字......

问题是我不知道如何告诉程序在空格之后和字符串'\ 0'结束之前再次运行算法

char text[SIZE], new[SIZE];
int x, i, length;

void truncW ()
{
    printf("Insert text!\n");

    fgets (text, SIZE, stdin);

    printf("\nInsert number of chars per word.\n");

    scanf("%d",&x);

    while (text[i]!=' '){
        i++;
        memmove(new, text, x);
    }

    printf("%s", new);
}

int main()
{
    truncW();
    return 0;
}

6 个答案:

答案 0 :(得分:2)

我建议,

  1. 使用fgets()

    读取该行
     fgets (text, SIZE, stdin);
    
  2. 定义一个临时char数组来保存修改后的o / p。

    char buf[SIZE] = {0};
    
  3. 使用strtok()使用空格(" ")作为分隔符进行标记

    char * token = NULL;
    token = (text, " \n");
    
  4. 如果令牌不是NULL,请使用nchar的{​​{1}}号(取自用户)准确打印到临时数组。

    snprintf()
  5. 转到第3步并继续,直到snprintf(buf, n+1, "%s ", token); 返回NULL。

  6. 最后,打印临时数组。

    strtok()

答案 1 :(得分:0)

void truncW(void){
    char text[SIZE], new[SIZE];
    int x, i, j, n;

    printf("Input text!\n");
    fgets(text, SIZE, stdin);

    printf("\nInput number of chars per word.\n");
    scanf("%d", &x);

    for(i=j=n=0; text[i] != '\0'; i++){
        if(text[i]!=' '){
            if(n < x){//Copy restrictions
                new[j++] = text[i];
                ++n;
            }
        } else {
            new[j++] = text[i];
            n = 0;
        }
    }
    new[j] = '\0';

    printf("%s\n", new);
}

答案 2 :(得分:0)

我建议这样的事情:

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

#define MAXLEN 50

void TruncateWords(char* Str, int WordLen)
{
    char Temp[MAXLEN];
    memset(Temp, 0, sizeof(Temp));

    char* pch = strtok(Str, " ");
    while (pch != NULL)
    {
        strncat(Temp, pch, WordLen);
        strcat(Temp, " ");
        pch = strtok(NULL, " ");
    }

    size_t Len = strlen(Temp) - 1;      // Don't copy the last added space
    strncpy(Str, Temp, Len);
    Str[Len] = '\0';        // strncpy doesn't null-terminate it in this case
}

int main()
{
    char Text[MAXLEN];
    int WordLen;

    printf("Insert text!\n");
    fgets(Text, sizeof(Text), stdin);
    Text[strlen(Text) - 1] = '\0';      // Get rid of fgets's \n

    printf("\nInsert number of chars per word.\n");
    scanf("%d", &WordLen);

    TruncateWords(Text, WordLen);

    puts(Text);

    return 0;
}

您还应该为WordLen的值添加一些检查 - 可能不应该大于MAXLEN

答案 3 :(得分:0)

试试这个

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

int rendsiz(char* str, char* delimiters, int x)
{
   char*h = NULL, *data = strdup(str);
   h = strtok(data, delimiters);
   int count = 0, lg = 0;
   while(h)
   {
     lg = strlen(h);
     if(lg>=x)count+=x+1;
     else count+=lg+1;
     h = strtok(NULL, delimiters);
   }
   free(data);
   return count;
}

void custprintf(char *data, char* delimiters, int x)
{
   char* st = strdup(data); //dup string, strtok mage change on the passed string
   int offset = 0, siz = 0, lg = 0, bufsiz = rendsiz(data, delimiters, x);
   char* t=NULL, *buf=(char *)malloc(bufsiz);
   memset(buf, 0, bufsiz);
   t = strtok(st, delimiters); #split string by " "
   while(t)
   {
     lg = strlen(t);
     if(lg>=x)siz = x;
     else siz = lg;
     memcpy(buf+offset, t, siz);
     buf[offset+siz]=' ';
     offset+=siz+1;
     t = strtok(NULL, delimiters);
   }
   printf("%s\n", buf);
   free(buf);
   free(st);
}

这实际上有效

答案 4 :(得分:0)

这是另一种在不需要临时数组的情况下就地修改字符串的方法:

q)table:([] col1:(); col2:(); col3:());
q)`table insert (1;2;3);
q)conditionalInsert:{if[first where table.col1=x(0)~0N;`table insert x]};

答案 5 :(得分:-1)

这应该标记为“家庭作业”: - )?

我会避免使用memmove。这只会导致麻烦。由于您已经愿意分配固定缓冲区,因此您可以简单地遍历数组,即时填充新数组:

/* x is max characters per word (as per your example);
   y counts those characters */
int y = 0;

while (*text) {
    int is_space = *text == ' ';
    int must_show = y <= x;

    if (must_show) {
        *new++ = *text++;
        y++;
    } else {
        while (*text != ' ') text++;
    }
    if (is_space || !must_show) y = 0;
}
*new = '\0';

我没有测试过这个。风格可能不符合您的要求。