C - 如何拆分用户输入的字符串

时间:2016-02-05 04:02:42

标签: c string

我在使用这个程序时遇到了麻烦,因为我真的不知道该怎么做。我还是C新手,我真的不明白这一点。我会发布我目前的代码,但我怀疑我做得对。还请你放轻松,我还是新人。

“编写一个从键盘读取字符串的程序。如果字符串的长度是偶数,程序应该将字符串拆分为两个长度相等的字符串。如果字符串的长度是奇数,则程序应该将字符串拆分为两个字符串,其中第一部分比第二部分多一个字符。您的程序应该输出它创建的两个字符串“

示例:“HelloEveryone”,因为奇数会分成“HelloEv”“eryone”。

如果是“HelloWorld”,它会分成“Hello”“World”,因为它是偶数。

#include <stdlib.h>
#include <studio.h>
#include <string.h>
int main(){

char input_string[100];
char string1[100];
char string2[100];
int length;

printf("Enter a sentence please: ");
gets(string1);
length = strlen(string1);

return 0;

}

6 个答案:

答案 0 :(得分:1)

您需要为新字符串创建两个独立的(来自输入字符串)数组。

另请注意,在你的'if'语句中,你没有做太多而你的i值没有初始化,因为你只使用一个'if'语句而不是while / for循环,所以你不要甚至不需要'我'。所以当然你的编译器会抛出适合...出于很多原因。看看input_string[i]%2。这是指由int表示的char,因此无需将其修改为2。也许你的意思是将长度调整为两个。相反,你需要将字符串长度修改或除以2以确定如何拆分它(然而,除法将告诉你数组需要多长时间。)*

input_string[i]/2是一个无效的声明。

您需要做的是:

  1. 为拆分字符串创建两个单独的数组
  2. 确定字符串长度是否为偶数
  3. 使用某种while / for循环遍历原始字符串,并将该字符串中的char复制到您的新阵列之一(直到您使用遍历至少一半的字符串,在这种情况下你需要开始复制到另一个数组)

    • 编辑澄清 - 字符由ints表示!

答案 1 :(得分:1)

你想要解决这个问题的方法是先弄清楚你的长度。

...
int len = strlen(input_string);
...

现在我们有了总长度,我们需要弄清楚每件的长度。要做到这一点,我们希望找到一半的长度,但要向上舍入。我们不能轻易地向上舍入,但二进制除法会自动向下舍入为正整数(例如3 / 2 == 1),这给出了第二个长度,无论输入是偶数还是奇数。

...
int len2 = len/2; // always the shorter of the two halves
...

对于最后一部分,我们需要简单地减去另一个长度。

...
int len1 = len - len2;
...

一旦我们有了长度,我们就可以简单地将字符串复制到新的缓冲区。

...
char out1[50]; // to match half the input
char out2[50];

// use strncpy(dest, src, len) to create substrings.
strncpy(out1, input_string       , len1); 
strncpy(out2, input_string + len1, len2); // copy starting at len1
...

答案 2 :(得分:0)

  • 你也可以这样做,

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    int main(){
    
        char input_string[100];
        char firstStr[100], secondStr[100];
    
        printf("Write a sentence \n");
        gets(input_string);
    
        int length = strlen(input_string);
        int i = 0;
        if(length % 2 == 0)
        {
    
            for(i = 0; i < length / 2; i++)
            {
                firstStr[i] = input_string[i];
            }
            firstStr[i] = '\0';
        }
        else
        {
                for(i = 0; i < (length / 2) + 1; i++)
                {
                    firstStr[i] = input_string[i];
                }
                firstStr[i] = '\0';
        }
        int k = 0;
        for(int j = i; input_string[j]; j++)
        {
            secondStr[k++] = input_string[j];
        }
        secondStr[k] = '\0';
        printf("%s %s\n",firstStr, secondStr);
        return 0;
    }
    
  • 希望这会有所帮助!

答案 3 :(得分:0)

我会做这样的事情,你真的不需要打扰字符串长度是否为奇数,如果你将长度除以2就得到你应该剪切字符串的地方,无论长度是奇数还是不:

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

int main()
{
  // first read the string, avoid using gets since it doesn't check
  // length of input.
  char string[100];

  if (fgets(string,sizeof(string),stdin) != NULL)
  {
    // now you have the string entered by the user, the string contains
    // also a \n which should not be counted.
    int len = strlen(string) - 1;
    int splitAt = len / 2;  // integer division, odd numbers will be truncated

    for (char* p = string; *p != '\n' && p < string + len; ++p)
    {
      fputc(*p, stdout);
      if ( --splitAt == 0) fputc('\n', stdout);
    }
  }

  return 0;
}

答案 4 :(得分:0)

  1. input_string[i]

    这里i的价值是什么?

    由于i未初始化,因此它包含垃圾值 因此,input_string[i]可能会i中的[0, 100]中的垃圾值<{>> <}>尝试访问100字节{{1}以外的字节这将导致未定义的行为

    1. input_string

      即使if(input_string[i] %2 == 0){的垃圾值在i(我们无法预测),[0, 100]究竟做了什么?

      在这种情况下,input_string[i] %2 == 0会指向input_string[i]数组的有效字符,并会给出 ASCII 值,因此input_string会给出当我们将 ASCII 值除以%2时得到的余数,这里没有任何意义。

      e.g。

      让我们假设2数组包含字符串input_stringHello World!处的垃圾是i(我们再也说不出垃圾了值)。

      因此1将指向字符input_string[i],因此einput_string[i] % 2作为1 ASCII e 101 1}}。

      1. input_string[i] / 2;

        这是一个表达式,它只产生input_string[i]2 ASCII 值的除法,但不会改变内存中的任何内容。

        e.g。

        对于上述假设,input_string[i] / 2;会产生50,而这就是它。

        1. printf("%s",input_string);

          这将打印存储在input_string中的原始字符串,假设表达式的计算结果为true

          但我们想要两个子串,那么它们在哪里呢?

          1. fgets(input_string,sizeof(input_string),stdin);

            在接受用户的字符串时,用户输入\n换行符以标记输入字符串的结尾,但如果fgets读取\n,则会将\n存储在缓冲区通常是不受欢迎的。

            为了解决这个问题,我们检查input_string的倒数第二个字符是\n(最后一个字符是\0)。如果是,那么我们将\0存储在倒数第二个位置,从而有效地将字符串的长度减少1

            length = strlen(input_string);  
            if(input_string[length-1] == '\n')  
            {  
                input_string[length-1] = '\0';  
                length--;  
            }  
            
          2. 解决方案

            • 由于我们需要存储两个子字符串,首先要声明两个char数组。
            • 我们可以使用strlen函数找出input_string的长度。
            • 我们可以使用%运算符来确定input_string的长度是even还是odd
            • 然后我们可以使用strncpystrcpy来创建所需的两个子字符串。

              char first[50], second[50];  
              int length, firstChars;  
              
              printf("Write a sentence \n");  
              if(fgets(input_string, sizeof(input_string), stdin) == NULL)
              {
                  printf("fgets failed!\n");
                  exit(1);
              }  
              
              length = strlen(input_string);  
              if(input_string[length-1] == '\n')  
              {  
                  input_string[length-1] = '\0';  
                  length--;  
              }  
              
              if(length % 2)  
                  firstChars = length/2 + 1;  
              else  
                  firstChars = length/2;  
              strncpy(first, input_string, firstChars);  
              first[firstChars] = '\0';  
              
              strcpy(second, input_string + firstChars);  
              
              printf("First substring: %s\n", first);  
              printf("Second substring: %s\n", second);  
              

答案 5 :(得分:0)

return 0之前插入此代码,您将获得答案并使用函数打印它。

  int i;
  for( i=0;i<length/2;i++)
  {
   string1[i]=input_string[i];
  }
  if(length%2!=0)
  {
    string1[i]=input_string[i];
    i++;

   }
    string1[i]='\0';
  while(i<length)
  {
    string2[i]=input_string[i];
    i++;
    }
   string2[i]='\0'

这里是奇数还是我们需要将输入数组的前半部分复制到string1,这是在第一个for循环的帮助下完成的。现在如果输入字符串的长度是奇数,我们添加下一个输入元素string to string1 else我们什么都不做。我们将剩下的元素复制到string2。为了关闭这两个字符串,我们用\0

结束它们