簡體   English   中英

從字符串中打印偶數和奇數字符的程序

[英]A program that prints even and odd characters from a 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;
}

當我嘗試編譯我的程序時,我得到兩個警告:

  1. 對於我的scanf我得到"format '%s' expects arguments of type char but argument has 'char * (*)[41]" 我不確定這意味着什么,但我認為這是因為數組初始化。

  2. while循環中,它給出了警告,指出指針和整數之間的比較。 我不確定這意味着什么,我認為在C中進行比較是合法的。

當我編譯程序時,我得到偶數和奇數字符串的隨機字符。

任何幫助,將不勝感激!

這個宣言是錯的:

char *str[41];

你宣布41個未初始化的字符串。 你要:

char str[41];

然后, scanf("%40s" , str); ,沒有&和限制輸入大小(安全)

那么循環(你的while (str[i]<41)是錯誤的,它可能會立即結束,因為字母從65開始(ascii代碼為“A”)。你想測試i對41但是測試str[i]反對\\0而不是,如果字符串不是40字節長的話,你會在oddeven字符串之一中獲得nul-termination char之后的所有垃圾)

while (str[i]) {
    if (i % 2 == 0) {
        odd[j++] = str[i];
    } else {
        even[k++] = str[i];
    }
    i++;
}

如果你想使用指針 (assignement requirements),只需像以前一樣定義str

char str[41];

如上所示掃描輸入值,然后指向它:

char *p = str;

現在您在緩沖區上定義了一個指針,如果您需要使用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++;
}

(我們必須為偶數/奇數測試增加i ,否則我們必須測試p-str均勻度)

aaaand最后一個經典錯誤(感謝最后一分鍾的評論), evenodd都不會被終止,因此在打印它們時最終會得到垃圾的風險,你需要:

even[k] = odd[j] = '\0';

(作為另一個答案陳述,檢查偶數和奇數的概念,預期結果可能是相反的方式)

您的代碼中存在多個問題:

  • 你定義了一個指針數組char *str[41] ,而不是char數組。
  • 您應該將數組傳遞給scanf而不是其地址:當傳遞給函數時,數組會衰減為指向其第一個元素的指針。
  • 您應該限制scanf讀取的字符數。
  • 你應該迭代直到字符串的結尾,而不是數組的所有元素,特別是使用(&str[i] < 41)將第i個元素的地址與值41 ,這是沒有意義的。 字符串的結尾是空終止符,可以使用(str[i] != '\\0')
  • 你應該用str[i]讀取str的字符。
  • 你應該null null evenodd數組。

這是一個修改版本:

#include <stdio.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): ");
    if (scanf("%40s", str) != 1)
        return 1;

    while (str[i] != '\0') {
        if (i % 2 == 0) {
            odd[j++] = str[i];
        } else {
            even[k++] = str[i];
        }
        i++;
    }
    odd[j] = even[k] = '\0';

    printf("The even string is: %s\n", even);
    printf("The odd string is: %s\n", odd);

    return 0;
}

請注意,您對偶數和奇數字符的解釋假定基於1的偏移,即:第一個字符是奇數字符。 這與C方法不一致,其中偶數字符將被解釋為甚至從字符串的開頭偏移,從0開始。

這是你的解決方案:)

#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 (i < strlen(str)) 
    {
        if (i % 2 == 0) {
                odd[j++] = str[i];
        } else {
                even[k++] = str[i];
        }
        i++;
    }
    odd[j] = '\0'; 
    even[k] = '\0';

    printf("The even string is:%s\n " , even);

    printf("The odd string is:%s\n " , odd);

    return 0;
}

解決了聲明中的錯誤,掃描字符串值,while循環的條件以及數組元素的賦值。 :)

許多答案都准備好指出原始代碼的問題。

下面是一些減少內存使用的想法,因為不需要 2個數組odd[], even[]

當看到“偶數”字符時,將它們打印出來。
當看到“奇數”字符時,將它們移動到數組的第一部分。

替代打印:如果代碼使用"%.*s" ,則數組不需要空字符終止。

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

int main(void) {
  char str[41];

  printf("Enter a string (40 characters maximum): ");
  fflush(stdout);
  if (scanf("%40s", str) == 1) {
    int i;
    printf("The even string is:");
    for (i = 0; str[i]; i++) {
      if (i % 2 == 0) {
        str[i / 2] = str[i];  // copy character to an earlier part of `str[]`
      } else {
        putchar(str[i]);
      }
    }
    printf("\n");
    printf("The odd string is:%.*s\n ", (i + 1) / 2, str);
  }
  return 0;
}

或者干脆

printf("The even string is:");
for (int i = 0; str[i]; i++) {
  if (i % 2 != 0) {
    putchar(str[i]);
  }
}
printf("\n");
printf("The odd string is:");
for (int i = 0; str[i]; i++) {
  if (i % 2 == 0) {
    putchar(str[i]);
  }
}
printf("\n");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM