从字符串中打印偶数和奇数字符的程序

chr*_*sHG 5 c arrays string

这是为家庭作业

我必须编写一个程序,要求用户输入一个字符串,然后我的程序将输入的字符串中的偶数和奇数值分开.这是我的计划.

#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)

当我尝试编译我的程序时,我得到两个警告:

  1. 因为我scanf得到了"format '%s' expects arguments of type char but argument has 'char * (*)[41]".我不确定这意味着什么,但我认为这是因为数组初始化.

  2. while循环中,它给出了警告,指出指针和整数之间的比较.我不确定这意味着什么,我认为在C中进行比较是合法的.

当我编译程序时,我得到偶数和奇数字符串的随机字符.

任何帮助,将不胜感激!

Jea*_*bre 7

这个宣言是错的:

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终止字符后,所有的垃圾在一个oddeven字符串中,如果字符串不完全是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最后经典的错误(由于最后一分钟的评论),evenodd不为空因此终止打印时,他们在年底获得垃圾的风险,您需要:

even[k] = odd[j] = '\0';
Run Code Online (Sandbox Code Playgroud)

(作为另一个答案陈述,检查偶数和奇数的概念,预期结果可能是相反的方式)

  • 我没有得到`while(str [i] <41)`. (4认同)
  • 注意:OP; s`printf("偶数字符串是:%s \n",偶数);`正在打印一个当然不是空字符终止的数组. (2认同)