我正在编写一个接收数组和整数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;
}
答案 0 :(得分:2)
我建议,
使用fgets()
fgets (text, SIZE, stdin);
定义一个临时char
数组来保存修改后的o / p。
char buf[SIZE] = {0};
使用strtok()
使用空格(" "
)作为分隔符进行标记
char * token = NULL;
token = (text, " \n");
如果令牌不是NULL
,请使用n
将char
的{{1}}号(取自用户)准确打印到临时数组。
snprintf()
转到第3步并继续,直到snprintf(buf, n+1, "%s ", token);
返回NULL。
最后,打印临时数组。
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';
我没有测试过这个。风格可能不符合您的要求。