我在使用这个程序时遇到了麻烦,因为我真的不知道该怎么做。我还是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;
}
答案 0 :(得分:1)
您需要为新字符串创建两个独立的(来自输入字符串)数组。
另请注意,在你的'if'语句中,你没有做太多而你的i值没有初始化,因为你只使用一个'if'语句而不是while / for循环,所以你不要甚至不需要'我'。所以当然你的编译器会抛出适合...出于很多原因。看看input_string[i]%2
。这是指由int表示的char
,因此无需将其修改为2。也许你的意思是将长度调整为两个。相反,你需要将字符串长度修改或除以2以确定如何拆分它(然而,除法将告诉你数组需要多长时间。)*
input_string[i]/2
是一个无效的声明。
您需要做的是:
使用某种while
/ for
循环遍历原始字符串,并将该字符串中的char
复制到您的新阵列之一(直到您使用遍历至少一半的字符串,在这种情况下你需要开始复制到另一个数组)
答案 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)
input_string[i]
这里i
的价值是什么?
由于i
未初始化,因此它包含垃圾值
因此,input_string[i]
可能会i
中的[0, 100]
中的垃圾值<{>> <}>尝试访问100
字节{{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_string
而Hello World!
处的垃圾是i
(我们再也说不出垃圾了值)。
因此1
将指向字符input_string[i]
,因此e
将input_string[i] % 2
作为1
的 ASCII e
101
1}}。
input_string[i] / 2;
这是一个表达式,它只产生input_string[i]
和2
的 ASCII 值的除法,但不会改变内存中的任何内容。
e.g。
对于上述假设,input_string[i] / 2;
会产生50
,而这就是它。
printf("%s",input_string);
这将打印存储在input_string
中的原始字符串,假设表达式的计算结果为true
。
但我们想要两个子串,那么它们在哪里呢?
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--;
}
解决方案
char
数组。strlen
函数找出input_string
的长度。 %
运算符来确定input_string
的长度是even
还是odd
。 然后我们可以使用strncpy
和strcpy
来创建所需的两个子字符串。
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