【问题标题】:Printing a string using pointers: Runtime Error使用指针打印字符串:运行时错误
【发布时间】:2014-04-27 08:16:19
【问题描述】:

我正在尝试编写一个将数字转换为罗马数字的程序。 (它是这里找到的代码的副本:How to convert integer value to Roman numeral string?)我很确定程序逻辑是正确的。这是我的代码:

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

int main(){
const char *huns[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
const char *tens[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
const char *ones[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
const int size[] = {0, 1, 2, 3, 2, 1, 2, 3, 4, 2};

char *_buffer;
unsigned int num;

input:
printf("Enter number to convert:\n");
scanf("%ud", &num);

if(num>4000)
    goto input;

while(num>=1000){
    *_buffer++ = 'M';
    num -= 1000;
}

strcpy (_buffer, huns[num/100]); _buffer += size[num/100]; num = num % 100;
strcpy (_buffer, tens[num/10]);  _buffer += size[num/10];  num = num % 10;
strcpy (_buffer, ones[num]);     _buffer += size[num];

*_buffer ='\0';
printf("%s", _buffer); // This is where the Runtime Error occurs.

return 0;
}

有人能解释一下为什么printf() 会在这里导致运行时错误吗?我也试过puts(),但没用。我尝试在 Code:Blocks 13.11 (MINGW gcc) 和 http://ideone.com 中编译和运行,但都给出了相同的错误。

【问题讨论】:

  • 因为你没有为_buffer分配内存..使用malloc..

标签: arrays string pointers runtime-error printf


【解决方案1】:

您的问题是(并且编译器可能已经对此发出警告)_buffer 未初始化,这意味着它指向内存中的某个随机地址 - 因此您的运行时错误。 将代码更改为

char buffer [128];
char *_buffer=buffer;

和 printf buffer(不是 _buffer)。

【讨论】:

  • 编译器没有显示任何警告。(这让我很生气)。不过感谢您的修复。我相信我没有为缓冲区预先分配内存,因此出现了这个问题。
  • 一个好的编译器会警告使用未初始化的变量。尝试将警告级别调高(gnu-c:-Wall
猜你喜欢
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
相关资源
最近更新 更多