这是为家庭作业
我必须编写一个程序,要求用户输入一个字符串,然后我的程序将输入的字符串中的偶数和奇数值分开.这是我的计划.
#include <stdio.h>
#include <string.h>
int main(void) {
char *str[41];
char odd[21];
char even[21];
int i = 0;
int j = 0;
int k = 0;
printf("Enter a string (40 characters maximum): ");
scanf("%s", &str);
while (&str[i] < 41) {
if (i % 2 == 0) {
odd[j++] = *str[i];
} else {
even[k++] = *str[i];
}
i++;
}
printf("The even string is:%s\n ", even);
printf("The odd string is:%s\n ", odd);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译我的程序时,我得到两个警告:
因为我scanf得到了"format '%s' expects arguments of type char but argument has 'char * (*)[41]".我不确定这意味着什么,但我认为这是因为数组初始化.
在while循环中,它给出了警告,指出指针和整数之间的比较.我不确定这意味着什么,我认为在C中进行比较是合法的.
当我编译程序时,我得到偶数和奇数字符串的随机字符.
任何帮助,将不胜感激!
这个宣言是错的:
char *str[41];
Run Code Online (Sandbox Code Playgroud)
你宣布41个未初始化的字符串.你要:
char str[41];
Run Code Online (Sandbox Code Playgroud)
那么,scanf("%40s" , str);没有&并限制输入大小(安全)
那么回路(其中你while (str[i]<41)是错误的,它可能是在结束一次,因为字母在65(ASCII码开始为"A").你想测试i对41,但测试str[i]针对\0代替,否则你会得到NUL终止字符后,所有的垃圾在一个odd或even字符串中,如果字符串不完全是40个字节长)
while (str[i]) {
if (i % 2 == 0) {
odd[j++] = str[i];
} else {
even[k++] = str[i];
}
i++;
}
Run Code Online (Sandbox Code Playgroud)
如果你想使用指针(assignement requirements),只需str像以前一样定义:
char str[41];
Run Code Online (Sandbox Code Playgroud)
如上所示扫描输入值,然后指向它:
char *p = str;
Run Code Online (Sandbox Code Playgroud)
现在您在缓冲区上定义了一个指针,如果您需要使用deference而不是索引访问,则可以执行以下操作:
while (*p) { // test end of string termination
if (i % 2 == 0) { // if ((p-str) % 2 == 0) { would allow to get rid of i
odd[j++] = *p;
} else {
even[k++] = *p;
}
p++;
i++;
}
Run Code Online (Sandbox Code Playgroud)
(我们必须增加i偶数/奇数测试,否则我们必须测试p-str均匀度)
aaaand最后经典的错误(由于最后一分钟的评论),even和odd不为空因此终止打印时,他们在年底获得垃圾的风险,您需要:
even[k] = odd[j] = '\0';
Run Code Online (Sandbox Code Playgroud)
(作为另一个答案陈述,检查偶数和奇数的概念,预期结果可能是相反的方式)