在c中操纵字符串

时间:2014-04-01 17:59:35

标签: c string token tokenize

我正在尝试从用户获取一个字符串输入,然后只反转以元音开头的单词。然后重新打印更改的字符串。我使用了strtok()函数将单词与字符串分开。但是反转单词,似乎是一个问题....我已经编写了这个程序的代码,但它有运行时错误。所以,如果有人能帮我纠正我的代码或为我提供解决方案,它将非常有用。 / p>

这是我的代码:

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

void reverse(char *tok);
int length(char *t);
int main()
{
  char sen[50];
  const char s[2] = " ";
  int i;
  printf("Enter a Sentence: ");
  gets(sen);

  char *token;
  token = strtok(sen, s);
  printf("Output: ");

  while (token != 0)
  {
    char z[20] =
    { *token };
    for (i = 0;; i++)
    {
      if (z[i] == ' ')
      {
        z[i] = '\0';
        break;
      }
    }
    if (z[0] == 'a' || z[0] == 'A' || z[0] == 'e' || z[0] == 'E' || z[0] == 'i'
        || z[0] == 'I' || z[0] == 'o' || z[0] == 'O' || z[0] == 'u'
        || z[0] == 'U')
    {
      reverse(token);
    }
    else
      printf("%s ", *token);

    token = strtok(NULL, s);
  }
  printf("\n");
  return 0;
}

//function for reversing the particular parts of string
void reverse(char *tok)
{
  char x[20] =
  { *tok };
  int i, j, len;
  char temp;

  for (i = 0;; i++)
  {
    if (x[i] == ' ')
    {
      x[i] = '\0';
      break;
    }
  }
  len = length(tok);

  j = len - 1;
  for (i = 0; x[i] != len / 2; i++)
  {
    temp = x[i];
    x[i] = x[j];
    x[j] = temp;
    j--;
  }
  printf("%s", x);
  printf(" ");
}

//function for determining the length of the token string
int length(char *t)
{
  int i = 0;
  char y[20] =
  { *t };
  for (;; i++)
  {
    if (y[i] == ' ')
    {
      y[i] = '\0';
      break;
    }
  }

  while (y[i] == '\0')
  {
    i++;
  }
  return i;
}

3 个答案:

答案 0 :(得分:2)

这一行

printf("%s ", *token);

传递char,其中0 - 终止char[]。{/ p>

吸取的教训是:始终编译并发出所有警告!(gcc为-Wall -Wextra -pedantic

答案 1 :(得分:1)

问题出在这一行:

if(z[i]==' ')

您已使用令牌' '拆分,这意味着' '中没有z[]。所以循环永远不会结束。

答案 2 :(得分:0)

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

void reverse(char *tok);
int length(char *t);

int main(){
    char sen[50];
    const char s[2] = " ";

    printf("Enter a Sentence: ");
    scanf("%49[^\n]", sen);//gets(sen); //"gets" : Obsolete !

    char *token = strtok(sen, s);

    printf("Output: ");

    while (token != NULL){
        char z = *token;
        if (z == 'A' || z == 'E' || z == 'I' || z == 'O' || z == 'U' ||
            z == 'a' || z == 'e' || z == 'i' || z == 'o' || z == 'u'){
            reverse(token);//print by this function
        } else {
            printf("%s ", token);
        }
        token = strtok(NULL, s);
    }
    printf("\n");
    return 0;
}

void reverse(char *tok){//original not change
    int i, len = length(tok);
    char x[len + 1];

    for (i = 0; i<len; ++i){
        x[i] = tok[len-i-1];
    }
    x[i]='\0';
    printf("%s ", x);
}

int length(char *t){//use strlen
    int i;
    for(i=0;*t;++i, ++t)
        ;
    return i;
}