fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MAX_SRC_LEN 20
  6. #define MAX_DUP_NUM 4
  7.  
  8. #define TO_TEXT(A) #A
  9. #define BUILD_FORMAT(LEN) "%" TO_TEXT(LEN) "s"
  10. #define INPUT_FORMAT BUILD_FORMAT(MAX_SRC_LEN)
  11.  
  12. char *copyStr(int n, const char *str);
  13.  
  14. static inline
  15. void clearStdinBuf()
  16. {
  17. char c;
  18. while((c = getchar()) != '\n' && c != EOF);
  19. }
  20.  
  21. int main(void) {
  22. char srcStr[MAX_SRC_LEN + 1] = {0}; // +1 for '\0'
  23. char *dupStr;
  24. int n, ret;
  25.  
  26. printf("using format for scanf: %s\n", INPUT_FORMAT);
  27. printf("enter a string(len<=%d):", MAX_SRC_LEN);
  28. ret = scanf(INPUT_FORMAT, srcStr);
  29. if (ret <= 0) {
  30. printf("error on scanf\n");
  31. return 1;
  32. }
  33. // clear extra input
  34. if (strlen(srcStr) == MAX_SRC_LEN) clearStdinBuf();
  35.  
  36. printf("n(n<=4)=");
  37. do {
  38. ret = scanf("%d", &n);
  39. if (ret <= 0) clearStdinBuf();
  40. if (n > 0 && n <= 4) break;
  41. printf("the n must <= 4, got %d, please enter again:", n);
  42. } while (1);
  43.  
  44. dupStr = copyStr(n, srcStr);
  45. printf("%s\n", dupStr);
  46.  
  47. return 0;
  48. }
  49.  
  50. char *copyStr(int n, const char *str) {
  51. int i, j, len = strlen(str);
  52. static char array[MAX_SRC_LEN * MAX_DUP_NUM + 1]; // +1 for '\0'
  53. for (i = 0; i < n; i++) {
  54. for (j = 0; j < len; j++) {
  55. array[len * i + j] = str[j];
  56. }
  57. }
  58. array[len * i] = '\0';
  59. return array;
  60. }
  61.  
Success #stdin #stdout 0s 2164KB
stdin
asdfg
2
stdout
using format for scanf: %20s
enter a string(len<=20):n(n<=4)=asdfgasdfg