我在我的代码中使用了函数,但不知何故它不再工作了
I use function in my code and somehow it doesnt work anymore
所以我正在练习一些关于函数如何工作的编码,我 运行 遇到了一个问题:
该代码旨在反转数字。该算法运行良好,所以我对此没有任何问题。但是我想在我的代码中使用函数所以我像下面一样编辑它并且不知何故它不再工作了(没有错误,但是当我 运行 代码时,在我输入第一个 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;
}
您的代码中存在几个问题:
input()
和 output()
没有 return
语句,应在您的代码中声明为 return void
。
input()
到 return 值比填充指针参数更有意义。因此在我的版本中 input()
确实 return 一个合适的 int
值。
- 在
revint()
中多次出现 a
、b
应该是 *a
、*b
(因为 a
和 b
是指针,我们需要先 de-reference 它)。
查看下面的代码:
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
可以是 re-written 以完全避免指针语义。它确实会使代码更简单,对于这个特定的用例,我实际上认为它更好。
我的回答是尽量保持用户在他的问题代码中引入的语义。所以我建议你只有在传递指针确实有意义时才应用我的解决方案。
input
更改为正确使用指针 (&*a
)。
删除了指向 revint
的指针,因为它没有帮助并且您的代码在那里有一个点错误(b += c;
修改指针而不是值)。
#include <stdio.h>
#include <string.h>
void input(int *a) {
scanf("%d", a);
}
int revint(int a){
int b = 0;
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);
output(b);
return 0;
}
所以我正在练习一些关于函数如何工作的编码,我 运行 遇到了一个问题:
该代码旨在反转数字。该算法运行良好,所以我对此没有任何问题。但是我想在我的代码中使用函数所以我像下面一样编辑它并且不知何故它不再工作了(没有错误,但是当我 运行 代码时,在我输入第一个 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;
}
您的代码中存在几个问题:
input()
和output()
没有return
语句,应在您的代码中声明为 returnvoid
。input()
到 return 值比填充指针参数更有意义。因此在我的版本中input()
确实 return 一个合适的int
值。- 在
revint()
中多次出现a
、b
应该是*a
、*b
(因为a
和b
是指针,我们需要先 de-reference 它)。
查看下面的代码:
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
可以是 re-written 以完全避免指针语义。它确实会使代码更简单,对于这个特定的用例,我实际上认为它更好。
我的回答是尽量保持用户在他的问题代码中引入的语义。所以我建议你只有在传递指针确实有意义时才应用我的解决方案。
input
更改为正确使用指针 (&*a
)。
删除了指向 revint
的指针,因为它没有帮助并且您的代码在那里有一个点错误(b += c;
修改指针而不是值)。
#include <stdio.h>
#include <string.h>
void input(int *a) {
scanf("%d", a);
}
int revint(int a){
int b = 0;
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);
output(b);
return 0;
}