2013-08-01 51 views
-2

在C++中,我试图创建字符串数组。同时,我想访问字符并改变它们像这样:C++字符串数组和访问字符

#include<iostream> 

using namespace std; 

int main(){ 
    int n; 
    cin >> n; 
    char lines[4][n+1]; 
    int color = 0; 
    for(int a = 0; a < n; a++){ 
     for(int i = 0; i < 4; i++){ 
      lines[i][a] = (char) (color % 25 + 97); 
      if(i == 1 || i == 3){ 
       color++; 
      } 
     } 
    } 
    cout << lines[0] << endl << lines[1] << endl << lines[2] << endl << lines[3]; 
    return 0; 
} 

时,我想它打印所有的“行[I]”似乎有一些未知字符。

预期:

交流励磁发电机

交流励磁发电机

bdfh

bdfh

输出:(http://i.stack.imgur.com/SR4Y4.png

aceg'aceg■bdfh

交流励磁发电机■bdfh

bdfh

bdfh

你知道原因吗? (我检查了我的整个代码多次,它导致我不知道我认为的字符数组阵列)

有没有其他方法可以做到这一点? (如果可能的话没有用C喜欢它的库)

编辑

我说我所有的代码此消息。

+0

您需要了解“想要打印”的内容。 –

+1

字符串以null结尾... –

+0

欢迎来到Stack Overflow。请尽快阅读[关于]页面。请说明如何打印阵列。除非你做了一些你没有看到的东西,把它们打印出来就好像它们是字符串一样,会显示出你看到的那种行为。既然你不显示任何代码改变'颜色',你应该在每个单元格中获得相同的值(''a'')。当你忽略代码的关键部分时,人们会感到沮丧 - 缺少代码时很难帮助你。请阅读如何创建SSCCE([简短,独立,正确的示例](http://sscce.org/))。 'n'的价值是什么? –

回答

2

我不能没有确切地看到你是如何打印是肯定的,但如果你只是通过印刷类似printf("%s\n", lines[i]);,然后你的问题是因为你忘记了null-终止你的字符串。

确保你做这样的事情

for (int i = 0; i < 4; i++) { 
    lines[i][n] = '\0'; 
} 
+0

赦免,我想如果你使用的是C++,那么'std :: cout << lines [i];' –

+0

这可能是对的,因为OP在她的代码中有明显的数组大小'n + 1'... –

+0

那么,如果'lines [0] [n]'和'lines [1] [n]'是可能的,那么OP的输出是不是null,但是'lines [3] [n]'和'lines [4] [n]'*是*。 –

0

正常工作对我来说:

#include <stdio.h> 

for(int i = 0; i != 4; ++i) 
{ 
    fwrite(lines[i], 1, n, stdout); 
    fputc('\n', stdout); 
} 

或者在C++:

#include <iostream> 
#include <string> 

for(int i = 0; i != 4; ++i) 
{ 
    std::cout << std::string(lines[i], n) << '\n'; 
} 
+1

虽然这可能是真的,但如果OP的问题是他不是以相同的方式打印呢?这不会帮助OP理解他为什么看到他所做的行为。 –

+0

@DennisMeng:通过一切手段发布一个解释OP的问题的答案:-) –

0
aceg'aceg■bdfh 

aceg■bdfh 

bdfh 

bdfh 

看你输出的话可以找:

line[0] in fact print line[0] & line [1] & line[2]. 
line[1] in fact print line[1] & line [2]. 

这意味着你“字符串”没有合适的停车标志。

使用line[i][n] = '\0'char[i][4] = '\0'如果你只存储4个字符。