我正在制作一个程序,要求用户输入一个单词以及用户想从该单词复制的字母数。当我使用Compile Online时程序可以工作,但是当我在Micrsoft Visual Studio中运行程序时,程序在我输入要复制的单词后冻结。我运行调试器,发现下面显示的错误。我接受它,from googling,我正在写出为阵列留出的内存量?我应该使用malloc来解决这个问题吗?以下是错误和代码(链接到原始stackoverflow thread。
lab1113problem7.exe中的0x0FFB0BA0(ucrtbased.dll)抛出异常:0xC0000005:访问冲突写入位置0x00B80000。
lab1113problem7.exe中0xFEFEFEFE处的未处理异常:0xC00001A5:检测到无效的异常处理程序例程(参数:0x00000003)。
程序'[7196] lab1113problem7.exe'已退出,代码为0(0x0)。
程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *copywords(char *dest, const char *source, size_t n);
int main(void) {
char words[50];
char newwords[50];
int num;
for (;;) {
printf("Type a word, or type 'quit' to quit: ");
if (scanf("%49s", words) != 1) {
printf("Invalid input!\n");
return 0;
}
if (!strcmp(words, "quit")) {
printf("Good bye!\n");
return 0;
}
printf("Type the # of chars to copy: ");
if (scanf("%d", &num) != 1) {
printf("Invalid input!\n");
return 0;
}
copywords(newwords, words, num);
printf("The word was %s\n", words);
printf("and the copied word is %s\n", newwords);
}
}
char *copywords(char *dest, const char *source, size_t n) {
size_t i;
for (i = 0; i < n && source[i] != '\0'; i++) {
dest[i] = source[i];
}
dest[i] = '\0';
return dest;
}
答案 0 :(得分:0)
一些调试代码,以确保事情按照预期的字符串工作:
// Place this at the top of your file, after your `#include` statements
// and use it in place of the 50s in your array defines.
#define MAX_ARRAY_SIZE 50
char *copywords(char *dest, const char *source, size_t n) {
size_t i;
for (i = 0; i < n && source[i] != '\0'; i++) {
if(i >= MAX_ARRAY_SIZE)
{
printf("I just blew up memory at %i\n", %i);
}
dest[i] = source[i];
}
dest[i] = '\0';
return dest;
}
注意:您可以在for循环中检查每次迭代的数组大小,以确保没有超出缓冲区。
不是直接的答案,而是比使用评论更容易尝试。如果printf被触发,你就知道发生了不好的事情......
更好的是,因为你传递的大小为n
,你可以在每次启动循环之前检查数组大小并立即处理坏数据。
char *copywords(char *dest, const char *source, size_t n) {
if(n >= MAX_ARRAY_SIZE)
{
printf("Array will overflow by %d bytes- truncating\n", n - MAX_ARRAY_SIZE);
n = MAX_ARRAY_SIZE;
}