繁体   English   中英

我不知道为什么我的代码出错了。 c语言,字符串迭代

[英]I don't know why I got it wrong in my code. c language, string iterations

问题 接收到字符串 S 后,编写一个程序,将每个字符重复 R 次,创建一个新字符串并打印出来。 也就是说,您可以通过将第一个字符重复 R 次和将第二个字符重复 R 次来生成 P。 S 仅包含 QR 码“字母数字”字符。

二维码“字母数字”字符为 0123456789ABCDEFGHIJK

输入 第一行给出了测试用例的数量 T (1 ≤ T ≤ 1,000)。 每个测试用例通过将重复次数 R (1 RR 88) 和字符串 S 划分为空格来给出。 S 的长度至少为 1 且不超过 20 个字符。

输出 每个测试用例的输出 P。

输入示例

2
3 ABC
5 /HTP

输出示例

AAABBBCCC
/////HHHHHTTTTTPPPPP

我的代码:

#include<stdio.h>
int main() {
    int a=0;
    scanf("%d", &a);
    for (int k = 0; k < a; k++) {
        int d;
        char b[20];
        scanf("%d", &d);
        scanf("%s", &b);
        for (int i = 0; b[i]!=NULL; i++) {
            for (int j = 0; j < d; j++) {
                printf("%c", b[i]);
            }
        }
    }
}

代码中有一个问题:

scanf("%s", b);

我们写“b”而不是“&b”

'&' 用于获取变量的地址。 C 没有字符串类型,字符串只是一个字符数组,一个数组变量存储第一个索引位置的地址。默认情况下,变量本身指向基地址,因此要访问字符串的基地址,没有需要添加一个额外的'&'

所以我们可以写:

#include<stdio.h>
int main() {
    int a=0;
    scanf("%d", &a);
    for (int k = 0; k < a; k++) {
        int d;
        scanf("%d", &d);
        char b[20];
        scanf("%s",b);
        for (int i = 0; b[i]; i++) {
            for (int j = 0; j < d; j++) {
                printf("%c", b[i]);
            }
        }
       printf("\n");
    }
}

改进

  • 使用size_t遍历数组
  • 注意: char b[20]; , b衰减为指针( sizeof()运算符是一个例外)
  • scanf("%s", &b); , &b不是必需的,它会导致未定义的行为,只需b就可以了
  • 始终检查scanf()输入是否成功
  • 不要使用"%s" ,使用"%<WIDTH>s" ,以避免缓冲区溢出
  • b[i]!=NULL是完全错误的, NULL是一个指针,而b[i]是一个char ,并且char不能与pointer进行比较,你应该检查'\0'或只是0
  • 使用= {}初始化变量b ,然后b的所有元素将为0
  • 对于空终止字符b的长度应为21 +1

最终代码

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

int main(void) {
    int a = 0;
    if (scanf("%d", &a) != 1) {
        fputs("bad input", stderr);
        return EXIT_FAILURE;
    }
    for (int k = 0; k < a; k++) {
        int d;
        if (scanf("%d", &d) != 1) {
            fputs("bad input", stderr);
            return EXIT_FAILURE;
        }
        char b[21] = {};
        if (scanf("%20s", b) != 1) {
            fputs("bad input", stderr);
            return EXIT_FAILURE;
        }
        for (size_t i = 0; b[i] != 0; i++) {
            for (int j = 0; j < d; j++) {
                printf("%c", b[i]);
            }
        }
        puts("\n");
    }
    return EXIT_SUCCESS;
}
输入
2
3 ABC
5 /HTP
输出
AAABBBCCC

/////HHHHHTTTTTPPPPP

TRY IT ONLINE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM