所以我正在練習一些關于函式如何作業的編碼,我遇到了一個問題:
代碼是為了反轉一個數字。該演算法運行良好,所以我對此沒有任何問題。但是我想在我的代碼中使用函式,所以我像下面這樣編輯它,不知何故它不再起作用(沒有錯誤,但是當我運行代碼時,在我輸入第一個 scanf 后,代碼停止并保持不變那個,沒有回應)。有人可以幫我解決這個問題(這個問題可能聽起來有點愚蠢,但我只是想做得更好:v)
代碼:
#include <stdio.h>
#include <string.h>
int input(int *a) {
scanf("%d", &*a);
}
int revint(int *a, int *b)
{
int c;
while(a != 0)
{
c = *a % 10;
*b *= 10;
b = c;
*a /= 10;
}
return *b;
}
int output(int b) {
printf("%d", b);
}
int main()
{
int a;
int b = 0;
input(&a);
revint(&a, &b);
output(b);
return 0;
}
uj5u.com熱心網友回復:
您的代碼中有幾個問題:
input()并且output()沒有return宣告,應該void在你的代碼中宣告回傳。input()回傳值而不是填充指標引數更有意義。因此在我的版本input()中確實回傳了一個正確的int值。a,binrevint()應該出現多次(因為和是指標*a,我們需要先取消參考它)。*bab
請看下面的代碼:
int input(void) {
int a;
scanf("%d", &a);
return a;
}
int revint(int *a, int *b)
{
int c;
*b = 0;
while (*a != 0)
{
c = *a % 10;
*b = *b * 10 c;
*a /= 10;
}
return *b;
}
void output(int b) {
printf("%d", b);
}
int main(void)
{
int a;
int b = 0;
a = input();
revint(&a, &b); // passing the addresses
output(b);
return 0;
}
注意:為簡單起見,該input()函式不驗證scanf()實際成功。最好在用戶正在處理的真實代碼中完成。
更好scanf():
if (scanf("%d", &a) != 1)
{
fprintf(stderr, "bad input\n");
exit(1);
}
在實際代碼中,只要輸入無效,用戶就可以考慮重試獲取輸入。
更新:
正如您在@Gerhard 的回答中看到的那樣,revint可以重寫以完全避免指標語意。它確實會使代碼更簡單,對于這個特定的用例,我實際上認為它更好。我的答案是為了盡可能多地維護用戶在他的問題代碼中引入的語意。因此,我建議您僅在傳遞指標確實有意義時才應用我的解決方案。
uj5u.com熱心網友回復:
input更改為正確使用指標 ( &*a)。
洗掉了指向的指標,revint因為它沒有幫助,并且您的代碼在那里有一個點錯誤(b = c;修改指標而不是值)。
#include <stdio.h>
#include <string.h>
void input(int *a) {
scanf("%d", a);
}
int revint(int a, int b){
int c;
while(a != 0)
{
c = a % 10;
b *= 10;
b = c;
a /= 10;
}
return b;
}
int output(int b) {
printf("%d", b);
}
int main(){
int a;
int b = 0;
input(&a);
b = revint(a, b);
output(b);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/459095.html
上一篇:第一次以管理員身份運行C程式
