我想打印属于字符串数组的字符串的每个字符。
代码的第一部分是:将整数作为输入,并创建该大小的数组。然后添加n个单词来填充数组(所以我得到一个字符串数组)。
这是我的想法
int n;
scanf("%d", &n);
char *a[n];
a[n] = malloc(n*sizeof(char));
int i;
int j;
for (i = 0; i < n; i++) {
a[i] = malloc(sizeof(char));
}
for ( i = 0; i < n; i++) {
printf("write the words: ");
scanf("%s", a[i]);
}
//till this point everything works
//now I need to print each character of the strings
for ( i = 0; i < n; i++) {
for ( j = 0; j < strlen(a[i][j]); j++) {
printf("%s", a[i][j]);
}
}
我收到了这个警告:
format指定类型'char *'但参数的类型为'char'[-Wformat]
在这一行:
printf("%s", a[i][j])`;
如果我执行,在输入单词后,我会出现分段错误。我没有解决两个for循环的问题。
答案 0 :(得分:2)
让我们逐行开始。
第1行错误,应为size_t n
(表示long unsigned int
)而不是int n
,请详细了解MALLOC。
下一行有问题:
a[n] = malloc(n*sizeof(char));
这意味着,如果n == 2
,则您拥有:
a[2] = malloc(n*sizeof(char));
你访问该ARRAY越界,该行应该是:
a = malloc(n*sizeof(char));
但是这是另一回事,sizeof(char)
至少1
的标准保证所以这一行:
a = malloc(n*sizeof(char));
与此行相同:
a = malloc( n * 1 );
下一个问题:
int i;
int j;
应该是:
size_t i;
size_t j;
为什么呢?好吧,因为一旦你意识到malloc
期望size_t
,那么你应该知道在那个LOOP中signed
和unsigend
之间的比较不是你需要的。
下一个问题:
for ( i = 0; i < n; i++) {
for ( j = 0; j < strlen(a[i][j]); j++) {
printf("%s", a[i][j]);
}
}
这里有更多问题:
strlen(a[i][j])
应为strlen( a[i]
此行:
printf("%s\n", a[i][j]);
应:
printf("%c\n", a[i][j]);
你应该注意的事情:
scanf
是否有错误。free
你malloc
。将所有内容放在一起后,您将获得:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main ( void ){
size_t n;
if ( scanf("%zu", &n) != 1 ){
printf("Error,scanf\n");
}
char *a[n];
for ( size_t i = 0; i < n; i++ ) {
a[i] = malloc( 256 );
if ( a[i] == NULL ){
printf("Error, malloc\n");
for ( size_t k = 0 ; k < i ; k++ ){
free( a[k] );
}
return 1;
}
}
for ( size_t i = 0 ; i < n ; i++ ) {
printf("write the words: ");
if ( scanf("%255s", a[i]) != 1 ){
printf("Error, scanf\n");
for ( size_t k = 0 ; k < n ; k++ ){
free( a[k] );
}
return 1;
}
}
for ( size_t i = 0 ; i < n ; i++ ) {
for ( size_t j = 0 ; j < strlen( a[i] ) ; j++ ) {
printf("%c\n", a[i][j]);
}
}
for ( size_t k = 0 ; k < n ; k++ ){
free( a[k] );
}
}