Ral*_*lph 1 c++ undefined-behavior
我正在大学学习 C++ 课程,每周我们都需要编写一个具有给定规范的程序。通常是围绕我们前一周在课堂上讨论的主题来解决的基本任务。当我们讨论指针数组和动态内存时,本周的课程自然是关于使用数组和动态内存分配。
分解一下,我们被要求编写的程序应该接受一个随机的用户输入(没有空格,只有一些随机字符),并将用户输入分为 3 类:大写、小写和特殊字符。
我使用的方法可能不是最有效的方法,但它可以完成工作,考虑到我们允许使用的唯一库是 iostream 和 cmath,但是我的问题来了。在课堂上,我几乎很快就编写了程序,编译了它,它立即运行,没有任何问题。如果您提供用户输入,例如 aAghC4,它将作为输出 AC agh 4
所以我继续从我家里的私人机器上的大学文件夹中下载我的程序来进行一些工作,使其在实践中更有效率。但是,当我在 Windows 机器上编译(未编辑和原始).cpp 时,它的输出是随机的、未定义的行为。无论是在课堂上还是在家里,我都使用 g++ 来编译我的文件,但是在家里我运行的是 Windows 7,在课堂上我们使用的是 Ubuntu 14.04。
如果有人能看看我的代码并告诉我为什么它在 Windows 机器上不起作用,我会非常高兴。
#include<iostream>
using namespace std;
int main(){
char input[80];
int counter = 0;
cin >> input;
for(int i = 0; input[i] != '\0'; i++){
counter++;
}
char *uppercase = new char[counter];
char *lowercase = new char[counter];
char *special = new char[counter];
for(int i = 0; i < (counter+1); i++){
switch(input[i]){
case 'a': lowercase[i] = input[i]; break;
case 'b': lowercase[i] = input[i]; break;
// I edited this part it basically goes on for the entire
// alphabet, first lowercase letters then uppercase
case 'Y': uppercase[i] = input[i]; break;
case 'Z': uppercase[i] = input[i]; break;
default: special[i] = input[i]; break;
}
}
for(int i = 0; i <= counter; i++){
cout << uppercase[i];
}
cout << " ";
for(int i = 0; i <= counter; i++){
cout << lowercase[i];
}
cout << " ";
for(int i = 0; i <= counter; i++){
cout << special[i];
}
delete[] uppercase;
delete[] lowercase;
delete[] special;
cout << endl;
}
Run Code Online (Sandbox Code Playgroud)
这是完整的源代码,不多也不少,谢谢大家的回复!
无论您是在ubuntu还是windows 7上运行,您在这两个程序中都有未定义的行为;您很幸运,它显示了您对前者的预期行为。
你是假设元素的有效范围在所有的阅读uppercase,lowercase和special是那[0, counter]这是不是这种情况; 您正在有效地读取循环中未初始化的内存,循环遍历这些数组的元素(并且出现未定义的行为)。
在ubuntu上运行代码时,您认为它有效的原因可能是因为您的三个数组的内存恰好是零初始化的;这意味着当您没有为特定元素分配值时,您的循环将打印一堆(通常在终端中不可见)。'\0'
char * p = new char[counter] ; // default-initialized `char`s (could have any value)
char * p = new char[counter] (); // value-initialized, all elements are `char()` ie. 0
Run Code Online (Sandbox Code Playgroud)
还有一个问题,你的循环,打印的内容uppercase,lowercase以及special有一个关闭的情况的一个问题。
所有这些循环的最后一个元素偏移量是counter-1,但您假设它是counter( i <= counter)。
不要打印您没有明确给出值的元素。
这可以通过为每个数组设置单独的计数器或其他一些方法(例如将数组的每个元素初始化为0并在找到此类值时停止迭代)来实现。
不要读取不属于您分配的内存的元素。
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |