[英]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;
}
當我嘗試編譯我的程序時,我得到兩個警告:
對於我的scanf
我得到"format '%s' expects arguments of type char but argument has 'char * (*)[41]"
。 我不確定這意味着什么,但我認為這是因為數組初始化。
在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字節長的話,你會在odd
或even
字符串之一中獲得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最后一個經典錯誤(感謝最后一分鍾的評論), even
和odd
都不會被終止,因此在打印它們時最終會得到垃圾的風險,你需要:
even[k] = odd[j] = '\0';
(作為另一個答案陳述,檢查偶數和奇數的概念,預期結果可能是相反的方式)
您的代碼中存在多個問題:
char *str[41]
,而不是char
數組。 scanf
而不是其地址:當傳遞給函數時,數組會衰減為指向其第一個元素的指針。 scanf
讀取的字符數。 (&str[i] < 41)
將第i
個元素的地址與值41
,這是沒有意義的。 字符串的結尾是空終止符,可以使用(str[i] != '\\0')
。 str[i]
讀取str
的字符。 even
和odd
數組。 這是一個修改版本:
#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.