問題陳述
今天是牛頓學校今年的第一節課。牛頓學校的學生 Nutan 收到了他的第一份作業。他將得到一個字串作為輸入。如果輸入是“Apple”,他的任務是列印“Gravity”;否則,他將不得不列印“Space”。
你能幫助 Nutan 完成他的第一個任務嗎?請注意,引號只是為了清楚起見。它們不是輸入字串的一部分,也不應該是輸出字串的一部分。輸入 輸入由包含字串 S(1 ≤ S ≤ 10 的長度)的單行組成。該字串僅由小寫和大寫字母組成。輸出根據輸入列印“重力”或“空間”。
我正在嘗試做的事情: 基本上,我正在使用用戶定義的字串并嘗試將其與硬輸入字串(即“Apple”)進行比較。如果兩個字串都匹配,那么它將列印“Gravity”,否則它將列印“Space”
#include <stdio.h> // header file for Standard Input Output
#include <stdlib.h> // header file for Standard Library
#include <string.h> // for strcmp() function
int main() {
char str1[10]="Apple";
char str2[20];
int value;
printf("Enter the input ");
scanf("%s", &str2[20]);
value = strcmp(str1, str2);
if(value==0)
printf("Gravity");
else
printf("Space");
return 0;
}
uj5u.com熱心網友回復:
scanf("%s", &str2[20]);
可能會通過超出范圍的訪問來呼叫未定義的行為。你應該:
- 將指標傳遞給陣列的第一個元素,而不是傳遞給最后一個元素的下一個元素。(大多數)運算式中的陣列會自動轉換為指向其第一個元素的指標。
- 指定要讀取的最大長度以避免緩沖區溢位。
- 檢查是否讀取成功。
該行應該是:
if (scanf("s", str2) != 1) {
puts("read error");
return 1;
}
uj5u.com熱心網友回復:
一些改進:
- 不要使用
"%s", 使用"%<WIDTH>s", 以避免緩沖區溢位 - 而不是使用bare
return 0;,而是使用return EXIT_SUCCESS;頭檔案中定義的stdlib.h。 - 總是檢查
scanf()輸入是否成功 - 使用
const char *代替char str1[10] - 沒必要
int value; - 語法錯誤:
&str2[20] - 無需傳遞地址
str2READ MORE str2用零初始化- 在您的for NULL ( ) 終止字符中添加
1更多空間str2'\0'
最終代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
const char *str1 = "Apple";
char str2[21] = {};
printf("Enter the input ");
if(scanf(" s", str2) != 1)
{
fprintf(stderr, "bad input\n");
return EXIT_FAILURE;
}
if(strcmp(str1, str2) == 0)
printf("Gravity");
else
printf("Space");
return EXIT_SUCCESS;
}
uj5u.com熱心網友回復:
您正在輸入從陣列 str2 的最后一個元素之后的記憶體地址開始的字串
scanf("%s", &str2[20]);
然后嘗試將字符陣列 str1 與未初始化的陣列 str2 進行比較
value = strcmp(str1, str2);
更改 scanf 的呼叫,例如
scanf("s", str2);
如果至少初始化陣列 str2,程式會更安全
char str2[20] = "";
此外,由于陣列 str1 沒有更改,因此您可以宣告一個指向字串文字的指標,而不是陣列
const char *str1 = "Apple";
而不是 printf 的呼叫
printf("Gravity");
//..
printf("Space");
最好使用看跌期權
puts("Gravity");
//..
puts("Space");
請注意,<stdlib.h>您的程式中沒有使用來自標頭的宣告。所以你可以洗掉這個包含指令
#include <stdlib.h> // header file for Standard Library
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/455485.html
